diff --git a/.eslintrc.js b/.eslintrc.js
index a301d47bc..1c43bfd51 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -5,6 +5,7 @@ module.exports = {
env: {
node: true,
mocha: true,
+ es2020: true,
},
extends: 'airbnb-base',
rules: {
@@ -24,7 +25,6 @@ module.exports = {
'no-console': [2, { allow: ['warn', 'error'] }],
'import/prefer-default-export': [0],
'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }],
- 'multiline-comment-style': 'error',
'import/no-extraneous-dependencies': 'off'
},
};
diff --git a/.githooks/pre-commit b/.githooks/pre-commit
index 89c92e9b8..2fc579e16 100755
--- a/.githooks/pre-commit
+++ b/.githooks/pre-commit
@@ -3,44 +3,63 @@
## To use this hook execute in the project root:
## git config --local core.hooksPath .githooks/
if npm run lint; then
+ ## force compile contracts
npx hardhat compile --force
+
+ ## contracts documentation
npm run docgen
+ npm run docgen:0.8.17
git add docs
- cp artifacts/contracts/PolygonZkEVMBridge.sol/PolygonZkEVMBridge.json compiled-contracts/
- cp artifacts/contracts/PolygonZkEVMGlobalExitRoot.sol/PolygonZkEVMGlobalExitRoot.json compiled-contracts/
+
+ ## copy contracts ABI to be exposed
+ ## V1 contracts
cp artifacts/contracts/PolygonZkEVMGlobalExitRootL2.sol/PolygonZkEVMGlobalExitRootL2.json compiled-contracts/
cp artifacts/contracts/lib/TokenWrapped.sol/TokenWrapped.json compiled-contracts/
+ cp artifacts/contracts/deployment/PolygonZkEVMDeployer.sol/PolygonZkEVMDeployer.json compiled-contracts/
+ cp artifacts/contracts/PolygonZkEVMTimelock.sol/PolygonZkEVMTimelock.json compiled-contracts/
+
+ ## Mocks
cp artifacts/contracts/mocks/PolygonZkEVMBridgeMock.sol/PolygonZkEVMBridgeMock.json compiled-contracts/
cp artifacts/contracts/mocks/ERC20PermitMock.sol/ERC20PermitMock.json compiled-contracts/
cp artifacts/contracts/mocks/PolygonZkEVMGlobalExitRootL2Mock.sol/PolygonZkEVMGlobalExitRootL2Mock.json compiled-contracts/
cp artifacts/contracts/mocks/PolygonZkEVMGlobalExitRootMock.sol/PolygonZkEVMGlobalExitRootMock.json compiled-contracts/
cp artifacts/contracts/mocks/PolygonZkEVMMock.sol/PolygonZkEVMMock.json compiled-contracts/
cp artifacts/contracts/mocks/VerifierRollupHelperMock.sol/VerifierRollupHelperMock.json compiled-contracts/
- cp artifacts/contracts/PolygonZkEVM.sol/PolygonZkEVM.json compiled-contracts/
- cp artifacts/contracts/verifiers/FflonkVerifier.sol/FflonkVerifier.json compiled-contracts/
+ cp artifacts/contracts/v2/mocks/PolygonRollupManagerMock.sol/PolygonRollupManagerMock.json compiled-contracts/
+
+ ## Verifiers
+ cp artifacts/contracts/verifiers/FflonkVerifier_10.sol/FflonkVerifier_10.json compiled-contracts/FflonkVerifier.json
+ cp artifacts/contracts/verifiers/v4.0.0-rc.3/SP1VerifierPlonk.sol/SP1VerifierPlonk.json compiled-contracts/SP1VerifierPlonk.json
+
+ ## openzeppelin
cp artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json compiled-contracts/
cp artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json compiled-contracts/
- cp artifacts/contracts/deployment/PolygonZkEVMDeployer.sol/PolygonZkEVMDeployer.json compiled-contracts/
- cp artifacts/contracts/PolygonZkEVMTimelock.sol/PolygonZkEVMTimelock.json compiled-contracts/
-
- cp artifacts/contracts/v2/PolygonRollupManager.sol/PolygonRollupManager.json compiled-contracts/
- cp artifacts/contracts/v2/mocks/PolygonRollupManagerMock.sol/PolygonRollupManagerMock.json compiled-contracts/
- cp artifacts/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol/PolygonRollupManagerMockInternalTest.json compiled-contracts/
+ ## V2 General
+ cp artifacts/contracts/v2/PolygonRollupManager.sol/PolygonRollupManager.json compiled-contracts/
cp artifacts/contracts/v2/PolygonZkEVMBridgeV2.sol/PolygonZkEVMBridgeV2.json compiled-contracts/
cp artifacts/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol/PolygonZkEVMGlobalExitRootV2.json compiled-contracts/
-
cp artifacts/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol/PolygonZkEVMGlobalExitRootV2.json compiled-contracts/
+
+ ## V2 Consensus
cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMEtrog.sol/PolygonZkEVMEtrog.json compiled-contracts/
cp artifacts/contracts/v2/consensus/zkEVM/PolygonZkEVMExistentEtrog.sol/PolygonZkEVMExistentEtrog.json compiled-contracts/
- cp artifacts/contracts/v2/previousVersions/PolygonZkEVMEtrogPrevious.sol/PolygonZkEVMEtrogPrevious.json compiled-contracts/
-
cp artifacts/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol/PolygonValidiumEtrog.json compiled-contracts/
cp artifacts/contracts/v2/consensus/validium/PolygonDataCommittee.sol/PolygonDataCommittee.json compiled-contracts/
+ cp artifacts/contracts/v2/consensus/pessimistic/PolygonPessimisticConsensus.sol/PolygonPessimisticConsensus.json compiled-contracts/
+ ## V2 utils
cp artifacts/contracts/v2/utils/ClaimCompressor.sol/ClaimCompressor.json compiled-contracts/
-
git add compiled-contracts
+
+ ## V2 Sovereign
+ cp artifacts/contracts/v2/sovereignChains/BridgeL2SovereignChain.sol/BridgeL2SovereignChain.json compiled-contracts/
+ cp artifacts/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol/GlobalExitRootManagerL2SovereignChain.json compiled-contracts/
+
+ ## generate forge selectors
+ forge selectors ls > docs/selectors.txt
+ git add docs/selectors.txt
+
exit 0
else
exit 1
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..b45af66d7
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,5 @@
+# global owner
+* @invocamanman
+
+# src owners
+/contracts/ @invocamanman @krlosMata @ignasirv @laisolizq
\ No newline at end of file
diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml
index 84f77df6c..ecea28d77 100644
--- a/.github/workflows/build-docker.yml
+++ b/.github/workflows/build-docker.yml
@@ -4,57 +4,31 @@
name: Build-Docker image
on:
- push:
- branches: [main]
+ push:
+ branches: [main, develop, feature/ongoingPP]
+ pull_request:
+ branches: [main, develop, feature/ongoingPP]
jobs:
- build:
- runs-on: ubuntu-latest
+ build:
+ runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [16.x]
+ strategy:
+ matrix:
+ node-version: [20.x]
- steps:
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - name: Set int-bot SSH key
- run: |
- touch /tmp/ssh-key
- echo "${{ secrets.INT_BOT_SSH_KEY }}" > /tmp/ssh-key
- chmod 400 /tmp/ssh-key
- eval "$(ssh-agent -s)"
- ssh-add /tmp/ssh-key
- - name: Checkout code
- uses: actions/checkout@v2
- - name: setup
- run: |
- eval "$(ssh-agent -s)"
- ssh-add /tmp/ssh-key
- npm i
- sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- sudo chmod +x /usr/local/bin/docker-compose
- - name: Login to DockerHub
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Build docker
- run: npm run docker:contracts
- - name: Push docker image
- run: npm run push:docker:contracts
- # Steps to push multi-platform image, it relies on the previous step:
- # npm run docker:contracts
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v1
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
- - name: Build and push
- uses: docker/build-push-action@v2
- with:
- platforms: linux/amd64,linux/arm64
- push: true
- tags: hermeznetwork/geth-zkevm-contracts:1.5-integration
- file: docker/Dockerfile
- context: .
+ steps:
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: Setup docker
+ run: |
+ npm i
+ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+ sudo chmod +x /usr/local/bin/docker-compose
+ - name: Build docker
+ run: npm run dockerv2:contracts
+ - name: Test docker
+ run: npm run docker:tests
diff --git a/.github/workflows/build-push-docker.yml b/.github/workflows/build-push-docker.yml
new file mode 100644
index 000000000..de5067b47
--- /dev/null
+++ b/.github/workflows/build-push-docker.yml
@@ -0,0 +1,60 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: Build-Docker image and push it
+
+on:
+ push:
+ branches: [main]
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [20.x]
+
+ steps:
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Set int-bot SSH key
+ run: |
+ touch /tmp/ssh-key
+ echo "${{ secrets.INT_BOT_SSH_KEY }}" > /tmp/ssh-key
+ chmod 400 /tmp/ssh-key
+ eval "$(ssh-agent -s)"
+ ssh-add /tmp/ssh-key
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: setup
+ run: |
+ eval "$(ssh-agent -s)"
+ ssh-add /tmp/ssh-key
+ npm i
+ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+ sudo chmod +x /usr/local/bin/docker-compose
+ - name: Login to DockerHub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Build docker
+ run: npm run docker:contracts
+ - name: Push docker image
+ run: npm run push:docker:contracts
+ # Steps to push multi-platform image, it relies on the previous step:
+ # npm run docker:contracts
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v1
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ - name: Build and push
+ uses: docker/build-push-action@v2
+ with:
+ platforms: linux/amd64,linux/arm64
+ push: true
+ tags: hermeznetwork/geth-zkevm-contracts:1.5-integration
+ file: docker/Dockerfile
+ context: .
diff --git a/.github/workflows/compile.yml b/.github/workflows/compile.yml
new file mode 100644
index 000000000..07b035cdf
--- /dev/null
+++ b/.github/workflows/compile.yml
@@ -0,0 +1,32 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: Main CI
+
+on:
+ push:
+ branches: [main, develop, feature/ongoingPP]
+ pull_request:
+ branches: [main, develop, feature/ongoingPP]
+
+jobs:
+ lint-and-test:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [20.x]
+
+ steps:
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: setup
+ run: npm i
+ - name: linter
+ run: npm run lint
+ - name: compile
+ run: npm run compile
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 9a594a59c..4d11b2e18 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -4,30 +4,29 @@
name: Main CI
on:
- push:
- branches: [main, develop]
- pull_request:
- branches: [main, develop]
+ push:
+ branches: [main, develop, feature/ongoingPP]
+ pull_request:
+ branches: [main, develop, feature/ongoingPP]
jobs:
- lint-and-test:
- runs-on: ubuntu-latest
+ lint-and-test:
+ runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [16.x]
+ strategy:
+ matrix:
+ node-version: [20.x]
- steps:
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
- - name: Checkout code
- uses: actions/checkout@v2
- - name: setup
- run: npm i
- - name: linter
- run: npm run lint
- - name: test
- run: npm run test
-
\ No newline at end of file
+ steps:
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Checkout code
+ uses: actions/checkout@v3
+ - name: setup
+ run: npm i
+ - name: linter
+ run: npm run lint
+ - name: test
+ run: npm run test
diff --git a/.gitignore b/.gitignore
index ca2367c8b..7f6fd160b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,3 +22,7 @@ typechain-types/
create_rollup_parameters.json
docker/deploymentOutput
+
+.DS_Store
+
+tools/createSovereignGenesisWithHardhat/genesis-sovereign_hardhat.json
diff --git a/audits/Sigma Prime - Polygon - LXLY Banana - Security Assessment Report - 2.0.pdf b/audits/Sigma Prime - Polygon - LXLY Banana - Security Assessment Report - 2.0.pdf
new file mode 100644
index 000000000..9fccb92d1
Binary files /dev/null and b/audits/Sigma Prime - Polygon - LXLY Banana - Security Assessment Report - 2.0.pdf differ
diff --git a/audits/Sigma_Prime_Polygon_LXLY_Sovereign_Chains_Security_Assessment_Report_v2_0.pdf b/audits/Sigma_Prime_Polygon_LXLY_Sovereign_Chains_Security_Assessment_Report_v2_0.pdf
new file mode 100644
index 000000000..4ee39fac2
Binary files /dev/null and b/audits/Sigma_Prime_Polygon_LXLY_Sovereign_Chains_Security_Assessment_Report_v2_0.pdf differ
diff --git a/compiled-contracts/BridgeL2SovereignChain.json b/compiled-contracts/BridgeL2SovereignChain.json
new file mode 100644
index 000000000..58e46256b
--- /dev/null
+++ b/compiled-contracts/BridgeL2SovereignChain.json
@@ -0,0 +1,1397 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "BridgeL2SovereignChain",
+ "sourceName": "contracts/v2/sovereignChains/BridgeL2SovereignChain.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "AlreadyClaimed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AmountDoesNotMatchMsgValue",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ClaimNotSet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "DestinationNetworkInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EmergencyStateNotAllowed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EtherTransferFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FailedTokenWrappedDeployment",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GasTokenNetworkMustBeZeroOnEther",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GlobalExitRootInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InputArraysLengthMismatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitializeFunction",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidSmtProof",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidSovereignWETHAddressParams",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidZeroAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MerkleTreeFull",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MessageFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MsgValueNotZero",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NativeTokenIsEther",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NoValueInMessagesOnGasTokenNetworks",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotValidAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotValidOwner",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotValidSignature",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotValidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyBridgeManager",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyEmergencyState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyNotEmergencyState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyRollupManager",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OriginNetworkInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TokenAlreadyMapped",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TokenAlreadyUpdated",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TokenNotMapped",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TokenNotRemapped",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "WETHRemappingNotSupportedOnGasTokenNetworks",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "leafType",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "originAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "depositCount",
+ "type": "uint32"
+ }
+ ],
+ "name": "BridgeEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "globalIndex",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "originAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "ClaimEvent",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EmergencyStateActivated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "EmergencyStateDeactivated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "legacyTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "updatedTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "MigrateLegacyToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "wrappedTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ }
+ ],
+ "name": "NewWrappedToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "sovereignTokenAddress",
+ "type": "address"
+ }
+ ],
+ "name": "RemoveLegacySovereignTokenAddress",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "bridgeManager",
+ "type": "address"
+ }
+ ],
+ "name": "SetBridgeManager",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "sovereignTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isNotMintable",
+ "type": "bool"
+ }
+ ],
+ "name": "SetSovereignTokenAddress",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "sovereignWETHTokenAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isNotMintable",
+ "type": "bool"
+ }
+ ],
+ "name": "SetSovereignWETHAddress",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "leafIndex",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "sourceBridgeNetwork",
+ "type": "uint32"
+ }
+ ],
+ "name": "UnsetClaim",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "BASE_INIT_BYTECODE_WRAPPED_TOKEN",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "WETHToken",
+ "outputs": [
+ {
+ "internalType": "contract TokenWrapped",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "activateEmergencyState",
+ "outputs": [],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "forceUpdateGlobalExitRoot",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "permitData",
+ "type": "bytes"
+ }
+ ],
+ "name": "bridgeAsset",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "bridgeManager",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "forceUpdateGlobalExitRoot",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ }
+ ],
+ "name": "bridgeMessage",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amountWETH",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "forceUpdateGlobalExitRoot",
+ "type": "bool"
+ },
+ {
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ }
+ ],
+ "name": "bridgeMessageWETH",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "leafHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProof",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "uint32",
+ "name": "index",
+ "type": "uint32"
+ }
+ ],
+ "name": "calculateRoot",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "calculateTokenWrapperAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProofLocalExitRoot",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProofRollupExitRoot",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "globalIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "mainnetExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "rollupExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ }
+ ],
+ "name": "claimAsset",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProofLocalExitRoot",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProofRollupExitRoot",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "uint256",
+ "name": "globalIndex",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "mainnetExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "rollupExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "metadata",
+ "type": "bytes"
+ }
+ ],
+ "name": "claimMessage",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "claimedBitMap",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "deactivateEmergencyState",
+ "outputs": [],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "depositCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "gasTokenAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "gasTokenMetadata",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "gasTokenNetwork",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "leafType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "destinationNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "destinationAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "metadataHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getLeafValue",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getRoot",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "getTokenMetadata",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ }
+ ],
+ "name": "getTokenWrappedAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "globalExitRootManager",
+ "outputs": [
+ {
+ "internalType": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "_networkID",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "_gasTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "_gasTokenNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "name": "_globalExitRootManager",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_polygonRollupManager",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "_gasTokenMetadata",
+ "type": "bytes"
+ },
+ {
+ "internalType": "address",
+ "name": "_bridgeManager",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_sovereignWETHAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "_sovereignWETHAddressIsNotMintable",
+ "type": "bool"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ },
+ {
+ "internalType": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "leafIndex",
+ "type": "uint32"
+ },
+ {
+ "internalType": "uint32",
+ "name": "sourceBridgeNetwork",
+ "type": "uint32"
+ }
+ ],
+ "name": "isClaimed",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "isEmergencyState",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lastUpdatedDepositCount",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "legacyTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "migrateLegacyToken",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "networkID",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "polygonRollupManager",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "internalType": "uint8",
+ "name": "decimals",
+ "type": "uint8"
+ }
+ ],
+ "name": "precalculatedWrapperAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "legacySovereignTokenAddress",
+ "type": "address"
+ }
+ ],
+ "name": "removeLegacySovereignTokenAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_bridgeManager",
+ "type": "address"
+ }
+ ],
+ "name": "setBridgeManager",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32[]",
+ "name": "originNetworks",
+ "type": "uint32[]"
+ },
+ {
+ "internalType": "address[]",
+ "name": "originTokenAddresses",
+ "type": "address[]"
+ },
+ {
+ "internalType": "address[]",
+ "name": "sovereignTokenAddresses",
+ "type": "address[]"
+ },
+ {
+ "internalType": "bool[]",
+ "name": "isNotMintable",
+ "type": "bool[]"
+ }
+ ],
+ "name": "setMultipleSovereignTokenAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sovereignWETHTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "isNotMintable",
+ "type": "bool"
+ }
+ ],
+ "name": "setSovereignWETHAddress",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "tokenInfoToWrappedToken",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32[]",
+ "name": "leafIndexes",
+ "type": "uint32[]"
+ },
+ {
+ "internalType": "uint32[]",
+ "name": "sourceBridgeNetworks",
+ "type": "uint32[]"
+ }
+ ],
+ "name": "unsetMultipleClaimedBitmap",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "updateGlobalExitRoot",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "leafHash",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32[32]",
+ "name": "smtProof",
+ "type": "bytes32[32]"
+ },
+ {
+ "internalType": "uint32",
+ "name": "index",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "root",
+ "type": "bytes32"
+ }
+ ],
+ "name": "verifyMerkleProof",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "wrappedAddress",
+ "type": "address"
+ }
+ ],
+ "name": "wrappedAddressIsNotMintable",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "isNotMintable",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "wrappedTokenToTokenInfo",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "originNetwork",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "originTokenAddress",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x608060405234801562000010575f80fd5b506200001b6200002b565b620000256200002b565b620000ea565b5f54610100900460ff1615620000975760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000e8575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615fd680620000f85f395ff3fe6080604052600436106101e4575f3560e01c80638c0dd470116101075780638c0dd470146104ba5780638ed7e3f2146104d95780639e76158f146104f8578063aaa13cc214610517578063b458696214610536578063b8b284d014610555578063bab161bf14610574578063be5831c714610595578063bf130d7f146105b8578063c00f14ab146105d7578063c0f49163146105f6578063cc46163214610624578063ccaa2d1114610643578063cd58657914610662578063d02103ca14610675578063dbc1697614610246578063eabd372a1461069b578063ee25560b146106ba578063f5efcd79146106e5578063f811bff714610704578063fb57083414610723575f80fd5b806314cc01a0146101e857806315064c961461021d5780632072f6c51461024657806322e95f2c1461025c578063240ff3781461027b57806327aef4e81461028e5780632dfdf0b5146102af578063318aee3d146102d25780633c351e10146103395780633cbc795b146103585780633e197043146103905780634b2f336d146103af57806357cfbee3146103ce5780635ca1e165146103ed5780637843298b1461040157806379e2cf971461042057806381b1c1741461043457806383c43a551461046857806383f244031461047c5780638781a5c51461049b575b5f80fd5b3480156101f3575f80fd5b5060a354610207906001600160a01b031681565b60405161021491906131df565b60405180910390f35b348015610228575f80fd5b506068546102369060ff1681565b6040519015158152602001610214565b348015610251575f80fd5b5061025a610742565b005b348015610267575f80fd5b5061020761027636600461321d565b61075b565b61025a6102893660046132a3565b6107a9565b348015610299575f80fd5b506102a2610819565b6040516102149190613364565b3480156102ba575f80fd5b506102c460535481565b604051908152602001610214565b3480156102dd575f80fd5b506103156102ec36600461337d565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610214565b348015610344575f80fd5b50606d54610207906001600160a01b031681565b348015610363575f80fd5b50606d5461037b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610214565b34801561039b575f80fd5b506102c46103aa3660046133a6565b6108a5565b3480156103ba575f80fd5b50606f54610207906001600160a01b031681565b3480156103d9575f80fd5b5061025a6103e8366004613556565b610931565b3480156103f8575f80fd5b506102c4610a27565b34801561040c575f80fd5b5061020761041b366004613655565b610b03565b34801561042b575f80fd5b5061025a610b2c565b34801561043f575f80fd5b5061020761044e36600461369b565b606a6020525f90815260409020546001600160a01b031681565b348015610473575f80fd5b506102a2610b4f565b348015610487575f80fd5b506102c46104963660046136c3565b610b6e565b3480156104a6575f80fd5b5061025a6104b53660046136ff565b610c43565b3480156104c5575f80fd5b5061025a6104d43660046137d1565b610cee565b3480156104e4575f80fd5b50606c54610207906001600160a01b031681565b348015610503575f80fd5b5061025a61051236600461389a565b610fcf565b348015610522575f80fd5b506102076105313660046138c4565b611107565b348015610541575f80fd5b5061025a61055036600461337d565b611207565b348015610560575f80fd5b5061025a61056f366004613959565b611368565b34801561057f575f80fd5b5060685461037b90610100900463ffffffff1681565b3480156105a0575f80fd5b5060685461037b90600160c81b900463ffffffff1681565b3480156105c3575f80fd5b5061025a6105d23660046139d6565b6113e1565b3480156105e2575f80fd5b506102a26105f136600461337d565b6114ab565b348015610601575f80fd5b5061023661061036600461337d565b60a26020525f908152604090205460ff1681565b34801561062f575f80fd5b5061023661063e366004613a02565b6114f0565b34801561064e575f80fd5b5061025a61065d366004613a33565b611540565b61025a610670366004613b16565b611924565b348015610680575f80fd5b5060685461020790600160281b90046001600160a01b031681565b3480156106a6575f80fd5b5061025a6106b536600461337d565b611cc4565b3480156106c5575f80fd5b506102c46106d436600461369b565b60696020525f908152604090205481565b3480156106f0575f80fd5b5061025a6106ff366004613a33565b611d46565b34801561070f575f80fd5b5061025a61071e366004613ba5565b611f8c565b34801561072e575f80fd5b5061023661073d366004613c34565b612031565b60405163441845b160e01b815260040160405180910390fd5b5f606a5f8484604051602001610772929190613c79565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156107cd57604051630bc011ff60e21b815260040160405180910390fd5b34158015906107e65750606f546001600160a01b031615155b15610804576040516301bd897160e61b815260040160405180910390fd5b610812858534868686612048565b5050505050565b606e805461082690613ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461085290613ca3565b801561089d5780601f106108745761010080835404028352916020019161089d565b820191905f5260205f20905b81548152906001019060200180831161088057829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b0316331461095c576040516357b738d160e11b815260040160405180910390fd5b8251845114158061096f57508151845114155b8061097c57508051845114155b1561099a5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561081257610a158582815181106109ba576109ba613cdb565b60200260200101518583815181106109d4576109d4613cdb565b60200260200101518584815181106109ee576109ee613cdb565b6020026020010151858581518110610a0857610a08613cdb565b6020026020010151612112565b80610a1f81613d03565b91505061099c565b6053545f90819081805b6020811015610afa578083901c600116600103610a8e5760338160208110610a5b57610a5b613cdb565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610abb565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610af290613d03565b915050610a31565b50919392505050565b5f610b248484610b12856122c2565b610b1b8661237d565b61053187612431565b949350505050565b605354606854600160c81b900463ffffffff161015610b4d57610b4d6124e5565b565b60405180611ba00160405280611b66815260200161443b611b66913981565b5f83815b6020811015610c3a57600163ffffffff8516821c81169003610bdd57848160208110610ba057610ba0613cdb565b602002013582604051602001610bc0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c28565b81858260208110610bf057610bf0613cdb565b6020020135604051602001610c0f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c3281613d03565b915050610b72565b50949350505050565b60a3546001600160a01b03163314610c6e576040516357b738d160e11b815260040160405180910390fd5b8051825114610c905760405163434f49f560e11b815260040160405180910390fd5b5f5b8251811015610ce957610cd7838281518110610cb057610cb0613cdb565b6020026020010151838381518110610cca57610cca613cdb565b6020026020010151612579565b80610ce181613d03565b915050610c92565b505050565b5f54610100900460ff1615808015610d0c57505f54600160ff909116105b80610d2c5750610d1b30612627565b158015610d2c57505f5460ff166001145b610d515760405162461bcd60e51b8152600401610d4890613d1b565b60405180910390fd5b5f805460ff191660011790558015610d72575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d1602600160281b600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610e3b5763ffffffff881615610e0457604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610e185750815b15610e3657604051630e6e237560e11b815260040160405180910390fd5b610f76565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610e728682613dae565b506001600160a01b038316610f3e57811515600103610ea457604051630e6e237560e11b815260040160405180910390fd5b610f195f801b6012604051602001610f0591906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052612636565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610f76565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610f7e6126b0565b8015610fc3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529061102b5760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f01518460200151604051602001611049929190613c79565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b0390811691508416810361109c5760405163e273c4a160e01b815260040160405180910390fd5b6110a684846126de565b6110b181338561276e565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f80868660405160200161111c929190613c79565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b66815260200161443b611b66913989898960405160200161116d93929190613e69565b60408051601f198184030181529082905261118b9291602001613ea1565b604051602081830303815290604052805190602001206040516020016111e394939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b03163314611232576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112829390929101613c79565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031615806112d657505f818152606a60205260409020546001600160a01b038481169116145b156112f45760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f908152606b6020908152604080832080546001600160c01b031916905560a290915290819020805460ff19169055517fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f0639061135b9085906131df565b60405180910390a1505050565b60685460ff161561138c57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b03166113b55760405163dde3cda760e01b815260040160405180910390fd5b606f546113cb906001600160a01b0316856126de565b6113d9868686868686612048565b505050505050565b60a3546001600160a01b0316331461140c576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661143557604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b60606114b6826122c2565b6114bf8361237d565b6114c884612431565b6040516020016114da93929190613e69565b6040516020818303038152906040529050919050565b5f80611506600160201b63ffffffff8516613ecf565b6115169063ffffffff8616613ee6565b600881901c5f90815260696020526040902054600160ff9092169190911b90811614949350505050565b60685460ff161561156457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611594576040516302caf51760e11b815260040160405180910390fd5b6115c78c8c8c8c8c6115c25f8e8e8e8e8e8e8e6040516115b5929190613ef9565b60405180910390206108a5565b6127f9565b6001600160a01b0386166116ae57606f546001600160a01b0316611692575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801561161d576020820181803683370190505b5060405161162b9190613f08565b5f6040518083038185875af1925050503d805f8114611665576040519150601f19603f3d011682016040523d82523d5f602084013e61166a565b606091505b505090508061168c57604051630ce8f45160e31b815260040160405180910390fd5b506118d7565b606f546116a9906001600160a01b0316858561276e565b6118d7565b606d546001600160a01b0387811691161480156116dc5750606d5463ffffffff888116600160a01b90920416145b156116f3575f6001600160a01b03851684826115f3565b60685463ffffffff61010090910481169088160361171f576116a96001600160a01b0387168585612952565b5f8787604051602001611733929190613c79565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806118c9575f6117a88386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061263692505050565b90506117b581888861276e565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516118bb959493929190613f4b565b60405180910390a1506118d4565b6118d481878761276e565b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a8888878760405161190e959493929190613f83565b60405180910390a1505050505050505050505050565b60685460ff161561194857604051630bc011ff60e21b815260040160405180910390fd5b6119506129a8565b60685463ffffffff610100909104811690881603611981576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611a64578834146119b45760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906119e190613ca3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0d90613ca3565b8015611a585780601f10611a2f57610100808354040283529160200191611a58565b820191905f5260205f20905b815481529060010190602001808311611a3b57829003601f168201915b50505050509150611c3b565b3415611a835760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611aa857611aa3888a6126de565b611c3b565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b0757611af6898b6126de565b602081015181519095509350611c2e565b8515611b1957611b19898b8989612a01565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190611b479030906004016131df565b602060405180830381865afa158015611b62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b869190613fb5565b9050611b9d6001600160a01b038b1633308e612cb2565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190611bcb9030906004016131df565b602060405180830381865afa158015611be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0a9190613fb5565b9050611c168282613fcc565b6068548c9850610100900463ffffffff169650935050505b611c37896114ab565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611c7a989796959493929190613fdf565b60405180910390a1611ca0611c9b5f85878f8f8789805190602001206108a5565b612cea565b8615611cae57611cae6124e5565b50505050611cbb60018055565b50505050505050565b60a3546001600160a01b03163314611cef576040516357b738d160e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040517f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd6791611d3b916131df565b60405180910390a150565b60685460ff1615611d6a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611d9a576040516302caf51760e11b815260040160405180910390fd5b611dbc8c8c8c8c8c6115c260018e8e8e8e8e8e8e6040516115b5929190613ef9565b606f545f906001600160a01b0316611e6f57846001600160a01b031684888a8686604051602401611df09493929190614049565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e259190613f08565b5f6040518083038185875af1925050503d805f8114611e5f576040519150601f19603f3d011682016040523d82523d5f602084013e611e64565b606091505b505080915050611f20565b606f54611e86906001600160a01b0316868661276e565b846001600160a01b031687898585604051602401611ea79493929190614049565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611edc9190613f08565b5f604051808303815f865af19150503d805f8114611f15576040519150601f19603f3d011682016040523d82523d5f602084013e611f1a565b606091505b50909150505b80611f3e576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051611f75959493929190613f83565b60405180910390a150505050505050505050505050565b5f54610100900460ff1615808015611faa57505f54600160ff909116105b80611fca5750611fb930612627565b158015611fca57505f5460ff166001145b611fe65760405162461bcd60e51b8152600401610d4890613d1b565b5f805460ff191660011790558015612007575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b60405180910390a150505050505050565b5f8161203e868686610b6e565b1495945050505050565b60685463ffffffff610100909104811690871603612079576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516120cd99989796959493929190614083565b60405180910390a1612104611c9b6001606860019054906101000a900463ffffffff16338a8a8a89896040516115b5929190613ef9565b82156113d9576113d96124e5565b6001600160a01b038316158061212f57506001600160a01b038216155b1561214d5760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff61010090910481169085160361217e5760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b900416156121bd576040516317abdeeb60e21b815260040160405180910390fd5b5f84846040516020016121d1929190613c79565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123089190613f08565b5f60405180830381855afa9150503d805f8114612340576040519150601f19603f3d011682016040523d82523d5f602084013e612345565b606091505b50915091508161237457604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b24565b610b2481612dd2565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916123c39190613f08565b5f60405180830381855afa9150503d805f81146123fb576040519150601f19603f3d011682016040523d82523d5f602084013e612400565b606091505b50915091508161237457604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b24565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124769190613f08565b5f60405180830381855afa9150503d805f81146124ae576040519150601f19603f3d011682016040523d82523d5f602084013e6124b3565b606091505b50915091508180156124c6575080516020145b6124d1576012610b24565b80806020019051810190610b2491906140ef565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d61252c610a27565b6040518263ffffffff1660e01b815260040161254a91815260200190565b5f604051808303815f87803b158015612561575f80fd5b505af1158015612573573d5f803e3d5ffd5b50505050565b5f61258e600160201b63ffffffff8416613ecf565b61259e9063ffffffff8516613ee6565b600881901c5f8181526069602052604090208054600160ff851690811b9182189283905593945091929190808216156125ea57604051630631b5f760e31b815260040160405180910390fd5b6040805163ffffffff808a168252881660208201527f4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a9101612020565b6001600160a01b03163b151590565b5f8060405180611ba00160405280611b66815260200161443b611b66913983604051602001612666929190613ea1565b6040516020818303038152906040529050838151602083015ff591506001600160a01b0382166126a9576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166126d65760405162461bcd60e51b8152600401610d489061410a565b610b4d612f5b565b6001600160a01b0382165f90815260a2602052604090205460ff1615612717576127136001600160a01b038316333084612cb2565b5050565b604051632770a7eb60e21b81526001600160a01b03831690639dc29fac906127459033908590600401614155565b5f604051808303815f87803b15801561275c575f80fd5b505af11580156113d9573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff16156127a257610ce96001600160a01b0384168383612952565b6040516340c10f1960e01b81526001600160a01b038416906340c10f19906127d09085908590600401614155565b5f604051808303815f87803b1580156127e7575f80fd5b505af1158015611cbb573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af115801561286f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128939190613fb5565b9050805f036128b457604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b8716156128f3578691506128d1848a8489612031565b6128ee576040516338105f3b60e21b815260040160405180910390fd5b61293d565b602087901c61290381600161416e565b915087925061291e612916868c86610b6e565b8a8389612031565b61293b576040516338105f3b60e21b815260040160405180910390fd5b505b6129478282612f81565b505050505050505050565b610ce98363a9059cbb60e01b8484604051602401612971929190614155565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ff3565b6002600154036129fa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d48565b6002600155565b5f612a0f600482848661418b565b612a18916141b2565b9050632afa533160e01b6001600160e01b0319821601612b4c575f808080808080612a46896004818d61418b565b810190612a5391906141e2565b96509650965096509650965096508a8514612a81576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612aff9190613f08565b5f604051808303815f865af19150503d805f8114612b38576040519150601f19603f3d011682016040523d82523d5f602084013e612b3d565b606091505b50505050505050505050610812565b6001600160e01b031981166323f2ebc360e21b14612b7d57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612b928a6004818e61418b565b810190612b9f9190614231565b975097509750975097509750975097508c6001600160a01b0316638fcbaf0c60e01b8989898989898989604051602401612c249897969594939291906001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c629190613f08565b5f604051808303815f865af19150503d805f8114612c9b576040519150601f19603f3d011682016040523d82523d5f602084013e612ca0565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125739085906323b872dd60e01b90608401612971565b806001612cf96020600261438f565b612d039190613fcc565b60535410612d24576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612d3390613d03565b918290555090505f5b6020811015612dc3578082901c600116600103612d6f578260338260208110612d6757612d67613cdb565b015550505050565b60338160208110612d8257612d82613cdb565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612dbb90613d03565b915050612d3c565b50610ce961439a565b60018055565b60606040825110612df157818060200190518101906107a391906143ae565b8151602003612f28575f5b602081108015612e2b5750828181518110612e1957612e19613cdb565b01602001516001600160f81b03191615155b15612e425780612e3a81613d03565b915050612dfc565b805f03612e795750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612e9257612e92613420565b6040519080825280601f01601f191660200182016040528015612ebc576020820181803683370190505b5090505f5b82811015612f2057848181518110612edb57612edb613cdb565b602001015160f81c60f81b828281518110612ef857612ef8613cdb565b60200101906001600160f81b03191690815f1a90535080612f1881613d03565b915050612ec1565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612dcc5760405162461bcd60e51b8152600401610d489061410a565b5f612f96600160201b63ffffffff8416613ecf565b612fa69063ffffffff8516613ee6565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055949550929392918183169003611cbb57604051630c8d9eab60e31b815260040160405180910390fd5b5f613047826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130c49092919063ffffffff16565b805190915015610ce95780806020019051810190613065919061441f565b610ce95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d48565b6060610b2484845f85855f80866001600160a01b031685876040516130e99190613f08565b5f6040518083038185875af1925050503d805f8114613123576040519150601f19603f3d011682016040523d82523d5f602084013e613128565b606091505b509150915061313987838387613144565b979650505050505050565b606083156131b05782515f036131a95761315d85612627565b6131a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d48565b5081610b24565b610b2483838151156131c55781518083602001fd5b8060405162461bcd60e51b8152600401610d489190613364565b6001600160a01b0391909116815260200190565b803563ffffffff81168114612f56575f80fd5b6001600160a01b038116811461321a575f80fd5b50565b5f806040838503121561322e575f80fd5b613237836131f3565b9150602083013561324781613206565b809150509250929050565b801515811461321a575f80fd5b5f8083601f84011261326f575f80fd5b5081356001600160401b03811115613285575f80fd5b60208301915083602082850101111561329c575f80fd5b9250929050565b5f805f805f608086880312156132b7575f80fd5b6132c0866131f3565b945060208601356132d081613206565b935060408601356132e081613252565b925060608601356001600160401b038111156132fa575f80fd5b6133068882890161325f565b969995985093965092949392505050565b5f5b83811015613331578181015183820152602001613319565b50505f910152565b5f8151808452613350816020860160208601613317565b601f01601f19169290920160200192915050565b602081525f6133766020830184613339565b9392505050565b5f6020828403121561338d575f80fd5b813561337681613206565b60ff8116811461321a575f80fd5b5f805f805f805f60e0888a0312156133bc575f80fd5b87356133c781613398565b96506133d5602089016131f3565b955060408801356133e581613206565b94506133f3606089016131f3565b9350608088013561340381613206565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561345c5761345c613420565b604052919050565b5f6001600160401b0382111561347c5761347c613420565b5060051b60200190565b5f82601f830112613495575f80fd5b813560206134aa6134a583613464565b613434565b82815260059290921b840181019181810190868411156134c8575f80fd5b8286015b848110156134ea576134dd816131f3565b83529183019183016134cc565b509695505050505050565b5f82601f830112613504575f80fd5b813560206135146134a583613464565b82815260059290921b84018101918181019086841115613532575f80fd5b8286015b848110156134ea57803561354981613206565b8352918301918301613536565b5f805f8060808587031215613569575f80fd5b84356001600160401b038082111561357f575f80fd5b61358b88838901613486565b95506020915081870135818111156135a1575f80fd5b6135ad89828a016134f5565b9550506040870135818111156135c1575f80fd5b6135cd89828a016134f5565b9450506060870135818111156135e1575f80fd5b87019050601f810188136135f3575f80fd5b80356136016134a582613464565b81815260059190911b8201830190838101908a83111561361f575f80fd5b928401925b8284101561364657833561363781613252565b82529284019290840190613624565b979a9699509497505050505050565b5f805f60608486031215613667575f80fd5b613670846131f3565b9250602084013561368081613206565b9150604084013561369081613206565b809150509250925092565b5f602082840312156136ab575f80fd5b5035919050565b8061040081018310156107a3575f80fd5b5f805f61044084860312156136d6575f80fd5b833592506136e785602086016136b2565b91506136f661042085016131f3565b90509250925092565b5f8060408385031215613710575f80fd5b82356001600160401b0380821115613726575f80fd5b61373286838701613486565b93506020850135915080821115613747575f80fd5b5061375485828601613486565b9150509250929050565b5f6001600160401b0382111561377657613776613420565b50601f01601f191660200190565b5f82601f830112613793575f80fd5b81356137a16134a58261375e565b8181528460208386010111156137b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c0312156137ea575f80fd5b6137f38a6131f3565b985060208a013561380381613206565b975061381160408b016131f3565b965060608a013561382181613206565b955060808a013561383181613206565b945060a08a01356001600160401b0381111561384b575f80fd5b6138578c828d01613784565b94505060c08a013561386881613206565b925060e08a013561387881613206565b91506101008a013561388981613252565b809150509295985092959850929598565b5f80604083850312156138ab575f80fd5b82356138b681613206565b946020939093013593505050565b5f805f805f60a086880312156138d8575f80fd5b6138e1866131f3565b945060208601356138f181613206565b935060408601356001600160401b038082111561390c575f80fd5b61391889838a01613784565b9450606088013591508082111561392d575f80fd5b5061393a88828901613784565b925050608086013561394b81613398565b809150509295509295909350565b5f805f805f8060a0878903121561396e575f80fd5b613977876131f3565b9550602087013561398781613206565b945060408701359350606087013561399e81613252565b925060808701356001600160401b038111156139b8575f80fd5b6139c489828a0161325f565b979a9699509497509295939492505050565b5f80604083850312156139e7575f80fd5b82356139f281613206565b9150602083013561324781613252565b5f8060408385031215613a13575f80fd5b613a1c836131f3565b9150613a2a602084016131f3565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613a4f575f80fd5b613a598e8e6136b2565b9b50613a698e6104008f016136b2565b9a506108008d013599506108208d013598506108408d01359750613a906108608e016131f3565b9650613aa06108808e0135613206565b6108808d01359550613ab56108a08e016131f3565b9450613ac56108c08e0135613206565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613aed575f80fd5b613afe8e6109008f01358f0161325f565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b2c575f80fd5b613b35886131f3565b96506020880135613b4581613206565b9550604088013594506060880135613b5c81613206565b93506080880135613b6c81613252565b925060a08801356001600160401b03811115613b86575f80fd5b613b928a828b0161325f565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613bba575f80fd5b613bc3876131f3565b95506020870135613bd381613206565b9450613be1604088016131f3565b93506060870135613bf181613206565b92506080870135613c0181613206565b915060a08701356001600160401b03811115613c1b575f80fd5b613c2789828a01613784565b9150509295509295509295565b5f805f806104608587031215613c48575f80fd5b84359350613c5986602087016136b2565b9250613c6861042086016131f3565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613cb757607f821691505b602082108103613cd557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d1457613d14613cef565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115610ce9575f81815260208120601f850160051c81016020861015613d8f5750805b601f850160051c820191505b818110156113d957828155600101613d9b565b81516001600160401b03811115613dc757613dc7613420565b613ddb81613dd58454613ca3565b84613d69565b602080601f831160018114613e0e575f8415613df75750858301515b5f19600386901b1c1916600185901b1785556113d9565b5f85815260208120601f198616915b82811015613e3c57888601518255948401946001909101908401613e1d565b5085821015613e5957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613e7b6060830186613339565b8281036020840152613e8d8186613339565b91505060ff83166040830152949350505050565b5f8351613eb2818460208801613317565b835190830190613ec6818360208801613317565b01949350505050565b80820281158282048414176107a3576107a3613cef565b808201808211156107a3576107a3613cef565b818382375f9101908152919050565b5f8251613f19818460208701613317565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131399083018486613f23565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f60208284031215613fc5575f80fd5b5051919050565b818103818111156107a3576107a3613cef565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161403084830187613339565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140799083018486613f23565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916140d58483018789613f23565b925080851660e085015250509a9950505050505050505050565b5f602082840312156140ff575f80fd5b815161337681613398565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b63ffffffff8181168382160190808211156126a9576126a9613cef565b5f8085851115614199575f80fd5b838611156141a5575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141da5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156141f8575f80fd5b873561420381613206565b9650602088013561421381613206565b95506040880135945060608801359350608088013561340381613398565b5f805f805f805f80610100898b031215614249575f80fd5b883561425481613206565b9750602089013561426481613206565b96506040890135955060608901359450608089013561428281613252565b935060a089013561429281613398565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156142e957815f19048211156142cf576142cf613cef565b808516156142dc57918102915b93841c93908002906142b4565b509250929050565b5f826142ff575060016107a3565b8161430b57505f6107a3565b8160018114614321576002811461432b57614347565b60019150506107a3565b60ff84111561433c5761433c613cef565b50506001821b6107a3565b5060208310610133831016604e8410600b841016171561436a575081810a6107a3565b61437483836142af565b805f190482111561438757614387613cef565b029392505050565b5f61337683836142f1565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143be575f80fd5b81516001600160401b038111156143d3575f80fd5b8201601f810184136143e3575f80fd5b80516143f16134a58261375e565b818152856020838501011115614405575f80fd5b614416826020830160208601613317565b95945050505050565b5f6020828403121561442f575f80fd5b81516133768161325256fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220ca7a7fd14ec73edf6b3d053ef2133e4a8110a83daf9abb364c35f9d9eb2a083564736f6c63430008140033",
+ "deployedBytecode": "0x6080604052600436106101e4575f3560e01c80638c0dd470116101075780638c0dd470146104ba5780638ed7e3f2146104d95780639e76158f146104f8578063aaa13cc214610517578063b458696214610536578063b8b284d014610555578063bab161bf14610574578063be5831c714610595578063bf130d7f146105b8578063c00f14ab146105d7578063c0f49163146105f6578063cc46163214610624578063ccaa2d1114610643578063cd58657914610662578063d02103ca14610675578063dbc1697614610246578063eabd372a1461069b578063ee25560b146106ba578063f5efcd79146106e5578063f811bff714610704578063fb57083414610723575f80fd5b806314cc01a0146101e857806315064c961461021d5780632072f6c51461024657806322e95f2c1461025c578063240ff3781461027b57806327aef4e81461028e5780632dfdf0b5146102af578063318aee3d146102d25780633c351e10146103395780633cbc795b146103585780633e197043146103905780634b2f336d146103af57806357cfbee3146103ce5780635ca1e165146103ed5780637843298b1461040157806379e2cf971461042057806381b1c1741461043457806383c43a551461046857806383f244031461047c5780638781a5c51461049b575b5f80fd5b3480156101f3575f80fd5b5060a354610207906001600160a01b031681565b60405161021491906131df565b60405180910390f35b348015610228575f80fd5b506068546102369060ff1681565b6040519015158152602001610214565b348015610251575f80fd5b5061025a610742565b005b348015610267575f80fd5b5061020761027636600461321d565b61075b565b61025a6102893660046132a3565b6107a9565b348015610299575f80fd5b506102a2610819565b6040516102149190613364565b3480156102ba575f80fd5b506102c460535481565b604051908152602001610214565b3480156102dd575f80fd5b506103156102ec36600461337d565b606b6020525f908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610214565b348015610344575f80fd5b50606d54610207906001600160a01b031681565b348015610363575f80fd5b50606d5461037b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610214565b34801561039b575f80fd5b506102c46103aa3660046133a6565b6108a5565b3480156103ba575f80fd5b50606f54610207906001600160a01b031681565b3480156103d9575f80fd5b5061025a6103e8366004613556565b610931565b3480156103f8575f80fd5b506102c4610a27565b34801561040c575f80fd5b5061020761041b366004613655565b610b03565b34801561042b575f80fd5b5061025a610b2c565b34801561043f575f80fd5b5061020761044e36600461369b565b606a6020525f90815260409020546001600160a01b031681565b348015610473575f80fd5b506102a2610b4f565b348015610487575f80fd5b506102c46104963660046136c3565b610b6e565b3480156104a6575f80fd5b5061025a6104b53660046136ff565b610c43565b3480156104c5575f80fd5b5061025a6104d43660046137d1565b610cee565b3480156104e4575f80fd5b50606c54610207906001600160a01b031681565b348015610503575f80fd5b5061025a61051236600461389a565b610fcf565b348015610522575f80fd5b506102076105313660046138c4565b611107565b348015610541575f80fd5b5061025a61055036600461337d565b611207565b348015610560575f80fd5b5061025a61056f366004613959565b611368565b34801561057f575f80fd5b5060685461037b90610100900463ffffffff1681565b3480156105a0575f80fd5b5060685461037b90600160c81b900463ffffffff1681565b3480156105c3575f80fd5b5061025a6105d23660046139d6565b6113e1565b3480156105e2575f80fd5b506102a26105f136600461337d565b6114ab565b348015610601575f80fd5b5061023661061036600461337d565b60a26020525f908152604090205460ff1681565b34801561062f575f80fd5b5061023661063e366004613a02565b6114f0565b34801561064e575f80fd5b5061025a61065d366004613a33565b611540565b61025a610670366004613b16565b611924565b348015610680575f80fd5b5060685461020790600160281b90046001600160a01b031681565b3480156106a6575f80fd5b5061025a6106b536600461337d565b611cc4565b3480156106c5575f80fd5b506102c46106d436600461369b565b60696020525f908152604090205481565b3480156106f0575f80fd5b5061025a6106ff366004613a33565b611d46565b34801561070f575f80fd5b5061025a61071e366004613ba5565b611f8c565b34801561072e575f80fd5b5061023661073d366004613c34565b612031565b60405163441845b160e01b815260040160405180910390fd5b5f606a5f8484604051602001610772929190613c79565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b031690505b92915050565b60685460ff16156107cd57604051630bc011ff60e21b815260040160405180910390fd5b34158015906107e65750606f546001600160a01b031615155b15610804576040516301bd897160e61b815260040160405180910390fd5b610812858534868686612048565b5050505050565b606e805461082690613ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461085290613ca3565b801561089d5780601f106108745761010080835404028352916020019161089d565b820191905f5260205f20905b81548152906001019060200180831161088057829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b60a3546001600160a01b0316331461095c576040516357b738d160e11b815260040160405180910390fd5b8251845114158061096f57508151845114155b8061097c57508051845114155b1561099a5760405163434f49f560e11b815260040160405180910390fd5b5f5b825181101561081257610a158582815181106109ba576109ba613cdb565b60200260200101518583815181106109d4576109d4613cdb565b60200260200101518584815181106109ee576109ee613cdb565b6020026020010151858581518110610a0857610a08613cdb565b6020026020010151612112565b80610a1f81613d03565b91505061099c565b6053545f90819081805b6020811015610afa578083901c600116600103610a8e5760338160208110610a5b57610a5b613cdb565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610abb565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610af290613d03565b915050610a31565b50919392505050565b5f610b248484610b12856122c2565b610b1b8661237d565b61053187612431565b949350505050565b605354606854600160c81b900463ffffffff161015610b4d57610b4d6124e5565b565b60405180611ba00160405280611b66815260200161443b611b66913981565b5f83815b6020811015610c3a57600163ffffffff8516821c81169003610bdd57848160208110610ba057610ba0613cdb565b602002013582604051602001610bc0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c28565b81858260208110610bf057610bf0613cdb565b6020020135604051602001610c0f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610c3281613d03565b915050610b72565b50949350505050565b60a3546001600160a01b03163314610c6e576040516357b738d160e11b815260040160405180910390fd5b8051825114610c905760405163434f49f560e11b815260040160405180910390fd5b5f5b8251811015610ce957610cd7838281518110610cb057610cb0613cdb565b6020026020010151838381518110610cca57610cca613cdb565b6020026020010151612579565b80610ce181613d03565b915050610c92565b505050565b5f54610100900460ff1615808015610d0c57505f54600160ff909116105b80610d2c5750610d1b30612627565b158015610d2c57505f5460ff166001145b610d515760405162461bcd60e51b8152600401610d4890613d1b565b60405180910390fd5b5f805460ff191660011790558015610d72575f805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8d1602600160281b600160c81b03191617600160281b6001600160a01b038a81169190910291909117909155606c80546001600160a01b03199081168984161790915560a380549091168683161790558916610e3b5763ffffffff881615610e0457604051630d43a60960e11b815260040160405180910390fd5b6001600160a01b038316151580610e185750815b15610e3657604051630e6e237560e11b815260040160405180910390fd5b610f76565b606d805463ffffffff8a16600160a01b026001600160c01b03199091166001600160a01b038c1617179055606e610e728682613dae565b506001600160a01b038316610f3e57811515600103610ea457604051630e6e237560e11b815260040160405180910390fd5b610f195f801b6012604051602001610f0591906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052612636565b606f80546001600160a01b0319166001600160a01b0392909216919091179055610f76565b606f80546001600160a01b0319166001600160a01b0385169081179091555f90815260a260205260409020805460ff19168315151790555b610f7e6126b0565b8015610fc3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050505050565b6001600160a01b038083165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529061102b5760405163828d566360e01b815260040160405180910390fd5b5f606a5f835f01518460200151604051602001611049929190613c79565b60408051601f198184030181529181528151602092830120835290820192909252015f20546001600160a01b0390811691508416810361109c5760405163e273c4a160e01b815260040160405180910390fd5b6110a684846126de565b6110b181338561276e565b604080513381526001600160a01b0386811660208301528316818301526060810185905290517fb7f8fd4d1faf9b2929dc269f59c53e3a2bccc44e9950f33a568fcbcb37eb69a99181900360800190a150505050565b5f80868660405160200161111c929190613c79565b6040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b66815260200161443b611b66913989898960405160200161116d93929190613e69565b60408051601f198184030181529082905261118b9291602001613ea1565b604051602081830303815290604052805190602001206040516020016111e394939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60a3546001600160a01b03163314611232576040516357b738d160e11b815260040160405180910390fd5b6001600160a01b038082165f908152606b6020908152604080832081518083018352905463ffffffff8116808352600160201b909104909516818401819052915190946112829390929101613c79565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031615806112d657505f818152606a60205260409020546001600160a01b038481169116145b156112f45760405163e0c897a760e01b815260040160405180910390fd5b6001600160a01b0383165f908152606b6020908152604080832080546001600160c01b031916905560a290915290819020805460ff19169055517fc2ae0bd0ec0fd0352bfe5bacac49637af342c1e40f1b80a7f74440dc7fe3f0639061135b9085906131df565b60405180910390a1505050565b60685460ff161561138c57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b03166113b55760405163dde3cda760e01b815260040160405180910390fd5b606f546113cb906001600160a01b0316856126de565b6113d9868686868686612048565b505050505050565b60a3546001600160a01b0316331461140c576040516357b738d160e11b815260040160405180910390fd5b606d546001600160a01b031661143557604051634cb4711360e11b815260040160405180910390fd5b606f80546001600160a01b0319166001600160a01b0384169081179091555f81815260a26020908152604091829020805460ff19168515159081179091558251938452908301527fc7318b7ed6ba4f2908a3de396d8ab49b1dadb55db5b55123247a401f29ff8d82910160405180910390a15050565b60606114b6826122c2565b6114bf8361237d565b6114c884612431565b6040516020016114da93929190613e69565b6040516020818303038152906040529050919050565b5f80611506600160201b63ffffffff8516613ecf565b6115169063ffffffff8616613ee6565b600881901c5f90815260696020526040902054600160ff9092169190911b90811614949350505050565b60685460ff161561156457604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611594576040516302caf51760e11b815260040160405180910390fd5b6115c78c8c8c8c8c6115c25f8e8e8e8e8e8e8e6040516115b5929190613ef9565b60405180910390206108a5565b6127f9565b6001600160a01b0386166116ae57606f546001600160a01b0316611692575f6001600160a01b03851684825b6040519080825280601f01601f19166020018201604052801561161d576020820181803683370190505b5060405161162b9190613f08565b5f6040518083038185875af1925050503d805f8114611665576040519150601f19603f3d011682016040523d82523d5f602084013e61166a565b606091505b505090508061168c57604051630ce8f45160e31b815260040160405180910390fd5b506118d7565b606f546116a9906001600160a01b0316858561276e565b6118d7565b606d546001600160a01b0387811691161480156116dc5750606d5463ffffffff888116600160a01b90920416145b156116f3575f6001600160a01b03851684826115f3565b60685463ffffffff61010090910481169088160361171f576116a96001600160a01b0387168585612952565b5f8787604051602001611733929190613c79565b60408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806118c9575f6117a88386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061263692505050565b90506117b581888861276e565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516118bb959493929190613f4b565b60405180910390a1506118d4565b6118d481878761276e565b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a8888878760405161190e959493929190613f83565b60405180910390a1505050505050505050505050565b60685460ff161561194857604051630bc011ff60e21b815260040160405180910390fd5b6119506129a8565b60685463ffffffff610100909104811690881603611981576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b038816611a64578834146119b45760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff169450906119e190613ca3565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0d90613ca3565b8015611a585780601f10611a2f57610100808354040283529160200191611a58565b820191905f5260205f20905b815481529060010190602001808311611a3b57829003601f168201915b50505050509150611c3b565b3415611a835760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b0390811690891603611aa857611aa3888a6126de565b611c3b565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b90049092169181018290529015611b0757611af6898b6126de565b602081015181519095509350611c2e565b8515611b1957611b19898b8989612a01565b6040516370a0823160e01b81525f906001600160a01b038b16906370a0823190611b479030906004016131df565b602060405180830381865afa158015611b62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b869190613fb5565b9050611b9d6001600160a01b038b1633308e612cb2565b6040516370a0823160e01b81525f906001600160a01b038c16906370a0823190611bcb9030906004016131df565b602060405180830381865afa158015611be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0a9190613fb5565b9050611c168282613fcc565b6068548c9850610100900463ffffffff169650935050505b611c37896114ab565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611c7a989796959493929190613fdf565b60405180910390a1611ca0611c9b5f85878f8f8789805190602001206108a5565b612cea565b8615611cae57611cae6124e5565b50505050611cbb60018055565b50505050505050565b60a3546001600160a01b03163314611cef576040516357b738d160e11b815260040160405180910390fd5b60a380546001600160a01b0319166001600160a01b0383169081179091556040517f32cf74f8a6d5f88593984d2cd52be5592bfa6884f5896175801a5069ef09cd6791611d3b916131df565b60405180910390a150565b60685460ff1615611d6a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614611d9a576040516302caf51760e11b815260040160405180910390fd5b611dbc8c8c8c8c8c6115c260018e8e8e8e8e8e8e6040516115b5929190613ef9565b606f545f906001600160a01b0316611e6f57846001600160a01b031684888a8686604051602401611df09493929190614049565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611e259190613f08565b5f6040518083038185875af1925050503d805f8114611e5f576040519150601f19603f3d011682016040523d82523d5f602084013e611e64565b606091505b505080915050611f20565b606f54611e86906001600160a01b0316868661276e565b846001600160a01b031687898585604051602401611ea79493929190614049565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611edc9190613f08565b5f604051808303815f865af19150503d805f8114611f15576040519150601f19603f3d011682016040523d82523d5f602084013e611f1a565b606091505b50909150505b80611f3e576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b89898888604051611f75959493929190613f83565b60405180910390a150505050505050505050505050565b5f54610100900460ff1615808015611faa57505f54600160ff909116105b80611fca5750611fb930612627565b158015611fca57505f5460ff166001145b611fe65760405162461bcd60e51b8152600401610d4890613d1b565b5f805460ff191660011790558015612007575f805461ff0019166101001790555b60405163f57ac68360e01b815260040160405180910390fd5b60405180910390a150505050505050565b5f8161203e868686610b6e565b1495945050505050565b60685463ffffffff610100909104811690871603612079576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff163389898988886053546040516120cd99989796959493929190614083565b60405180910390a1612104611c9b6001606860019054906101000a900463ffffffff16338a8a8a89896040516115b5929190613ef9565b82156113d9576113d96124e5565b6001600160a01b038316158061212f57506001600160a01b038216155b1561214d5760405163f6b2911f60e01b815260040160405180910390fd5b60685463ffffffff61010090910481169085160361217e5760405163658b23ad60e01b815260040160405180910390fd5b6001600160a01b038281165f908152606b6020526040902054600160201b900416156121bd576040516317abdeeb60e21b815260040160405180910390fd5b5f84846040516020016121d1929190613c79565b60408051808303601f1901815282825280516020918201205f818152606a835283812080546001600160a01b0319166001600160a01b038a8116918217909255868601865263ffffffff8c81168089528c8416878a01818152848752606b89528987209a518b54915194166001600160c01b031990911617600160201b93909516929092029390931790975560a2855291859020805460ff191689151590811790915585519182529381019590955292840192909252606083015291507fdbe8a5da6a7a916d9adfda9160167a0f8a3da415ee6610e810e753853597fce79060800160405180910390a15050505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516060915f9182916001600160a01b038616916123089190613f08565b5f60405180830381855afa9150503d805f8114612340576040519150601f19603f3d011682016040523d82523d5f602084013e612345565b606091505b50915091508161237457604051806040016040528060078152602001664e4f5f4e414d4560c81b815250610b24565b610b2481612dd2565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516060915f9182916001600160a01b038616916123c39190613f08565b5f60405180830381855afa9150503d805f81146123fb576040519150601f19603f3d011682016040523d82523d5f602084013e612400565b606091505b50915091508161237457604051806040016040528060098152602001681393d7d4d6535093d360ba1b815250610b24565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290515f91829182916001600160a01b038616916124769190613f08565b5f60405180830381855afa9150503d805f81146124ae576040519150601f19603f3d011682016040523d82523d5f602084013e6124b3565b606091505b50915091508180156124c6575080516020145b6124d1576012610b24565b80806020019051810190610b2491906140ef565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d61252c610a27565b6040518263ffffffff1660e01b815260040161254a91815260200190565b5f604051808303815f87803b158015612561575f80fd5b505af1158015612573573d5f803e3d5ffd5b50505050565b5f61258e600160201b63ffffffff8416613ecf565b61259e9063ffffffff8516613ee6565b600881901c5f8181526069602052604090208054600160ff851690811b9182189283905593945091929190808216156125ea57604051630631b5f760e31b815260040160405180910390fd5b6040805163ffffffff808a168252881660208201527f4a402ac607e71571d0543be8fcccc358a4df62dcd019a1e7f7e98ca6175e8f2a9101612020565b6001600160a01b03163b151590565b5f8060405180611ba00160405280611b66815260200161443b611b66913983604051602001612666929190613ea1565b6040516020818303038152906040529050838151602083015ff591506001600160a01b0382166126a9576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b5f54610100900460ff166126d65760405162461bcd60e51b8152600401610d489061410a565b610b4d612f5b565b6001600160a01b0382165f90815260a2602052604090205460ff1615612717576127136001600160a01b038316333084612cb2565b5050565b604051632770a7eb60e21b81526001600160a01b03831690639dc29fac906127459033908590600401614155565b5f604051808303815f87803b15801561275c575f80fd5b505af11580156113d9573d5f803e3d5ffd5b6001600160a01b0383165f90815260a2602052604090205460ff16156127a257610ce96001600160a01b0384168383612952565b6040516340c10f1960e01b81526001600160a01b038416906340c10f19906127d09085908590600401614155565b5f604051808303815f87803b1580156127e7575f80fd5b505af1158015611cbb573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b90925260648101919091525f91600160281b90046001600160a01b03169063257b3632906084016020604051808303815f875af115801561286f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128939190613fb5565b9050805f036128b457604051622f6fad60e01b815260040160405180910390fd5b5f80600160401b8716156128f3578691506128d1848a8489612031565b6128ee576040516338105f3b60e21b815260040160405180910390fd5b61293d565b602087901c61290381600161416e565b915087925061291e612916868c86610b6e565b8a8389612031565b61293b576040516338105f3b60e21b815260040160405180910390fd5b505b6129478282612f81565b505050505050505050565b610ce98363a9059cbb60e01b8484604051602401612971929190614155565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ff3565b6002600154036129fa5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d48565b6002600155565b5f612a0f600482848661418b565b612a18916141b2565b9050632afa533160e01b6001600160e01b0319821601612b4c575f808080808080612a46896004818d61418b565b810190612a5391906141e2565b96509650965096509650965096508a8514612a81576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e1691612aff9190613f08565b5f604051808303815f865af19150503d805f8114612b38576040519150601f19603f3d011682016040523d82523d5f602084013e612b3d565b606091505b50505050505050505050610812565b6001600160e01b031981166323f2ebc360e21b14612b7d57604051637141605d60e11b815260040160405180910390fd5b5f80808080808080612b928a6004818e61418b565b810190612b9f9190614231565b975097509750975097509750975097508c6001600160a01b0316638fcbaf0c60e01b8989898989898989604051602401612c249897969594939291906001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c629190613f08565b5f604051808303815f865af19150503d805f8114612c9b576040519150601f19603f3d011682016040523d82523d5f602084013e612ca0565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125739085906323b872dd60e01b90608401612971565b806001612cf96020600261438f565b612d039190613fcc565b60535410612d24576040516377ae67b360e11b815260040160405180910390fd5b5f60535f8154612d3390613d03565b918290555090505f5b6020811015612dc3578082901c600116600103612d6f578260338260208110612d6757612d67613cdb565b015550505050565b60338160208110612d8257612d82613cdb565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612dbb90613d03565b915050612d3c565b50610ce961439a565b60018055565b60606040825110612df157818060200190518101906107a391906143ae565b8151602003612f28575f5b602081108015612e2b5750828181518110612e1957612e19613cdb565b01602001516001600160f81b03191615155b15612e425780612e3a81613d03565b915050612dfc565b805f03612e795750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b5f816001600160401b03811115612e9257612e92613420565b6040519080825280601f01601f191660200182016040528015612ebc576020820181803683370190505b5090505f5b82811015612f2057848181518110612edb57612edb613cdb565b602001015160f81c60f81b828281518110612ef857612ef8613cdb565b60200101906001600160f81b03191690815f1a90535080612f1881613d03565b915050612ec1565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b5f54610100900460ff16612dcc5760405162461bcd60e51b8152600401610d489061410a565b5f612f96600160201b63ffffffff8416613ecf565b612fa69063ffffffff8516613ee6565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055949550929392918183169003611cbb57604051630c8d9eab60e31b815260040160405180910390fd5b5f613047826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130c49092919063ffffffff16565b805190915015610ce95780806020019051810190613065919061441f565b610ce95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d48565b6060610b2484845f85855f80866001600160a01b031685876040516130e99190613f08565b5f6040518083038185875af1925050503d805f8114613123576040519150601f19603f3d011682016040523d82523d5f602084013e613128565b606091505b509150915061313987838387613144565b979650505050505050565b606083156131b05782515f036131a95761315d85612627565b6131a95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d48565b5081610b24565b610b2483838151156131c55781518083602001fd5b8060405162461bcd60e51b8152600401610d489190613364565b6001600160a01b0391909116815260200190565b803563ffffffff81168114612f56575f80fd5b6001600160a01b038116811461321a575f80fd5b50565b5f806040838503121561322e575f80fd5b613237836131f3565b9150602083013561324781613206565b809150509250929050565b801515811461321a575f80fd5b5f8083601f84011261326f575f80fd5b5081356001600160401b03811115613285575f80fd5b60208301915083602082850101111561329c575f80fd5b9250929050565b5f805f805f608086880312156132b7575f80fd5b6132c0866131f3565b945060208601356132d081613206565b935060408601356132e081613252565b925060608601356001600160401b038111156132fa575f80fd5b6133068882890161325f565b969995985093965092949392505050565b5f5b83811015613331578181015183820152602001613319565b50505f910152565b5f8151808452613350816020860160208601613317565b601f01601f19169290920160200192915050565b602081525f6133766020830184613339565b9392505050565b5f6020828403121561338d575f80fd5b813561337681613206565b60ff8116811461321a575f80fd5b5f805f805f805f60e0888a0312156133bc575f80fd5b87356133c781613398565b96506133d5602089016131f3565b955060408801356133e581613206565b94506133f3606089016131f3565b9350608088013561340381613206565b9699959850939692959460a0840135945060c09093013592915050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561345c5761345c613420565b604052919050565b5f6001600160401b0382111561347c5761347c613420565b5060051b60200190565b5f82601f830112613495575f80fd5b813560206134aa6134a583613464565b613434565b82815260059290921b840181019181810190868411156134c8575f80fd5b8286015b848110156134ea576134dd816131f3565b83529183019183016134cc565b509695505050505050565b5f82601f830112613504575f80fd5b813560206135146134a583613464565b82815260059290921b84018101918181019086841115613532575f80fd5b8286015b848110156134ea57803561354981613206565b8352918301918301613536565b5f805f8060808587031215613569575f80fd5b84356001600160401b038082111561357f575f80fd5b61358b88838901613486565b95506020915081870135818111156135a1575f80fd5b6135ad89828a016134f5565b9550506040870135818111156135c1575f80fd5b6135cd89828a016134f5565b9450506060870135818111156135e1575f80fd5b87019050601f810188136135f3575f80fd5b80356136016134a582613464565b81815260059190911b8201830190838101908a83111561361f575f80fd5b928401925b8284101561364657833561363781613252565b82529284019290840190613624565b979a9699509497505050505050565b5f805f60608486031215613667575f80fd5b613670846131f3565b9250602084013561368081613206565b9150604084013561369081613206565b809150509250925092565b5f602082840312156136ab575f80fd5b5035919050565b8061040081018310156107a3575f80fd5b5f805f61044084860312156136d6575f80fd5b833592506136e785602086016136b2565b91506136f661042085016131f3565b90509250925092565b5f8060408385031215613710575f80fd5b82356001600160401b0380821115613726575f80fd5b61373286838701613486565b93506020850135915080821115613747575f80fd5b5061375485828601613486565b9150509250929050565b5f6001600160401b0382111561377657613776613420565b50601f01601f191660200190565b5f82601f830112613793575f80fd5b81356137a16134a58261375e565b8181528460208386010111156137b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f805f6101208a8c0312156137ea575f80fd5b6137f38a6131f3565b985060208a013561380381613206565b975061381160408b016131f3565b965060608a013561382181613206565b955060808a013561383181613206565b945060a08a01356001600160401b0381111561384b575f80fd5b6138578c828d01613784565b94505060c08a013561386881613206565b925060e08a013561387881613206565b91506101008a013561388981613252565b809150509295985092959850929598565b5f80604083850312156138ab575f80fd5b82356138b681613206565b946020939093013593505050565b5f805f805f60a086880312156138d8575f80fd5b6138e1866131f3565b945060208601356138f181613206565b935060408601356001600160401b038082111561390c575f80fd5b61391889838a01613784565b9450606088013591508082111561392d575f80fd5b5061393a88828901613784565b925050608086013561394b81613398565b809150509295509295909350565b5f805f805f8060a0878903121561396e575f80fd5b613977876131f3565b9550602087013561398781613206565b945060408701359350606087013561399e81613252565b925060808701356001600160401b038111156139b8575f80fd5b6139c489828a0161325f565b979a9699509497509295939492505050565b5f80604083850312156139e7575f80fd5b82356139f281613206565b9150602083013561324781613252565b5f8060408385031215613a13575f80fd5b613a1c836131f3565b9150613a2a602084016131f3565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613a4f575f80fd5b613a598e8e6136b2565b9b50613a698e6104008f016136b2565b9a506108008d013599506108208d013598506108408d01359750613a906108608e016131f3565b9650613aa06108808e0135613206565b6108808d01359550613ab56108a08e016131f3565b9450613ac56108c08e0135613206565b6108c08d013593506108e08d013592506001600160401b036109008e01351115613aed575f80fd5b613afe8e6109008f01358f0161325f565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613b2c575f80fd5b613b35886131f3565b96506020880135613b4581613206565b9550604088013594506060880135613b5c81613206565b93506080880135613b6c81613252565b925060a08801356001600160401b03811115613b86575f80fd5b613b928a828b0161325f565b989b979a50959850939692959293505050565b5f805f805f8060c08789031215613bba575f80fd5b613bc3876131f3565b95506020870135613bd381613206565b9450613be1604088016131f3565b93506060870135613bf181613206565b92506080870135613c0181613206565b915060a08701356001600160401b03811115613c1b575f80fd5b613c2789828a01613784565b9150509295509295509295565b5f805f806104608587031215613c48575f80fd5b84359350613c5986602087016136b2565b9250613c6861042086016131f3565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c90821680613cb757607f821691505b602082108103613cd557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201613d1457613d14613cef565b5060010190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b601f821115610ce9575f81815260208120601f850160051c81016020861015613d8f5750805b601f850160051c820191505b818110156113d957828155600101613d9b565b81516001600160401b03811115613dc757613dc7613420565b613ddb81613dd58454613ca3565b84613d69565b602080601f831160018114613e0e575f8415613df75750858301515b5f19600386901b1c1916600185901b1785556113d9565b5f85815260208120601f198616915b82811015613e3c57888601518255948401946001909101908401613e1d565b5085821015613e5957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613e7b6060830186613339565b8281036020840152613e8d8186613339565b91505060ff83166040830152949350505050565b5f8351613eb2818460208801613317565b835190830190613ec6818360208801613317565b01949350505050565b80820281158282048414176107a3576107a3613cef565b808201808211156107a3576107a3613cef565b818382375f9101908152919050565b5f8251613f19818460208701613317565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f906131399083018486613f23565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b5f60208284031215613fc5575f80fd5b5051919050565b818103818111156107a3576107a3613cef565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c083018190525f9161403084830187613339565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190525f906140799083018486613f23565b9695505050505050565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190525f916140d58483018789613f23565b925080851660e085015250509a9950505050505050505050565b5f602082840312156140ff575f80fd5b815161337681613398565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b63ffffffff8181168382160190808211156126a9576126a9613cef565b5f8085851115614199575f80fd5b838611156141a5575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156141da5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156141f8575f80fd5b873561420381613206565b9650602088013561421381613206565b95506040880135945060608801359350608088013561340381613398565b5f805f805f805f80610100898b031215614249575f80fd5b883561425481613206565b9750602089013561426481613206565b96506040890135955060608901359450608089013561428281613252565b935060a089013561429281613398565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156142e957815f19048211156142cf576142cf613cef565b808516156142dc57918102915b93841c93908002906142b4565b509250929050565b5f826142ff575060016107a3565b8161430b57505f6107a3565b8160018114614321576002811461432b57614347565b60019150506107a3565b60ff84111561433c5761433c613cef565b50506001821b6107a3565b5060208310610133831016604e8410600b841016171561436a575081810a6107a3565b61437483836142af565b805f190482111561438757614387613cef565b029392505050565b5f61337683836142f1565b634e487b7160e01b5f52600160045260245ffd5b5f602082840312156143be575f80fd5b81516001600160401b038111156143d3575f80fd5b8201601f810184136143e3575f80fd5b80516143f16134a58261375e565b818152856020838501011115614405575f80fd5b614416826020830160208601613317565b95945050505050565b5f6020828403121561442f575f80fd5b81516133768161325256fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220ca7a7fd14ec73edf6b3d053ef2133e4a8110a83daf9abb364c35f9d9eb2a083564736f6c63430008140033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/compiled-contracts/ClaimCompressor.json b/compiled-contracts/ClaimCompressor.json
index 1e99f81db..ae111a23e 100644
--- a/compiled-contracts/ClaimCompressor.json
+++ b/compiled-contracts/ClaimCompressor.json
@@ -109,8 +109,8 @@
"type": "function"
}
],
- "bytecode": "0x60c060405234801561000f575f80fd5b50604051610de8380380610de883398101604081905261002e9161004a565b6001600160a01b0390911660805263ffffffff1660a052610095565b5f806040838503121561005b575f80fd5b82516001600160a01b0381168114610071575f80fd5b602084015190925063ffffffff8116811461008a575f80fd5b809150509250929050565b60805160a051610d326100b65f395f61043201525f6104540152610d325ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806304e5557b1461003857806397b1410f14610061575b5f80fd5b61004b6100463660046105fc565b610076565b604051610058919061069a565b60405180910390f35b61007461006f3660046106ea565b61042b565b005b60605f8585604051602001610095929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290505f805b8481101561041f575f8686838181106100e3576100e3610756565b90506020028101906100f59190610783565b6100fe90610972565b90505f825f03610110575060206101a0565b5f5b602081101561019e578888610128600187610a68565b81811061013757610137610756565b90506020028101906101499190610783565b816020811061015a5761015a610756565b6020020135835f0151826020811061017457610174610756565b60200201511461018c57610189816001610a81565b91505b8061019681610a94565b915050610112565b505b6040805160f883901b7fff000000000000000000000000000000000000000000000000000000000000001660208201528151600181830301815260219091019091525f5b8281101561023b5783518290826020811061020157610201610756565b6020020151604051602001610217929190610ae6565b6040516020818303038152906040529150808061023390610a94565b9150506101e4565b506020830151515f9250156102fd57831580610255575084155b1561026357602091506102f8565b5f5b60208110156102f657898961027b600188610a68565b81811061028a5761028a610756565b905060200281019061029c9190610783565b6104000181602081106102b1576102b1610756565b6020020135846020015182602081106102cc576102cc610756565b6020020151146102e4576102e1816001610a81565b92505b806102ee81610a94565b915050610265565b505b600194505b8082604051602001610310929190610b07565b60405160208183030381529060405290505f5b8281101561037c57818460200151826020811061034257610342610756565b6020020151604051602001610358929190610ae6565b6040516020818303038152906040529150808061037490610a94565b915050610323565b505f83610100015161038e575f610391565b60015b6040858101516060870151608088015160a089015160c08a015160e08b0151805187516103d399988c989081901c979096909590949093909291602001610b50565b604051602081830303815290604052905086816040516020016103f7929190610cce565b604051602081830303815290604052965050505050808061041790610a94565b9150506100c8565b50909695505050505050565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000063ccaa2d1163f5efcd798585602082610824376020828101610844376108a486905261092061090452604082015b8183018110156105f157803560f81c80156104c357600181146104e0576104f9565b856003538560081c6002538560101c6001538560181c5f536104f9565b846003538460081c6002538460101c6001538460181c5f535b5060028101906004906001013560f81c60200280838337909101600181019161040001906020903560f81c02808383379190910190610400810190823560f81c9061041701536001820191506008826018830137600882019150606081019050600482601c830137600482019150602081019050601482600c83013760149182019160408201918390604c01376014820191506020810190506020828237602082013560e01c60408201819052602490920191606090910190808383375f9181019190915290810190601f808216602003160161094401622625a05a10156105df575f80fd5b5f80825f808b621e8480f150506104a1565b505050505050505050565b5f805f806060858703121561060f575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610634575f80fd5b818701915087601f830112610647575f80fd5b813581811115610655575f80fd5b8860208260051b8501011115610669575f80fd5b95989497505060200194505050565b5f5b8381101561069257818101518382015260200161067a565b50505f910152565b602081525f82518060208401526106b8816040850160208701610678565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f80602083850312156106fb575f80fd5b823567ffffffffffffffff80821115610712575f80fd5b818501915085601f830112610725575f80fd5b813581811115610733575f80fd5b866020828501011115610744575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7218336030181126107b5575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610120810167ffffffffffffffff81118282101715610810576108106107bf565b60405290565b5f82601f830112610825575f80fd5b60405161040080820182811067ffffffffffffffff8211171561084a5761084a6107bf565b6040528301818582111561085c575f80fd5b845b8281101561087657803582526020918201910161085e565b509195945050505050565b803563ffffffff81168114610894575f80fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610894575f80fd5b5f82601f8301126108cb575f80fd5b813567ffffffffffffffff808211156108e6576108e66107bf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561092c5761092c6107bf565b81604052838152866020858801011115610944575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80358015158114610894575f80fd5b5f6108e08236031215610983575f80fd5b61098b6107ec565b6109953684610816565b81526109a5366104008501610816565b602082015261080083013560408201526109c26108208401610881565b60608201526109d46108408401610899565b60808201526109e66108608401610899565b60a082015261088083013560c08201526108a083013567ffffffffffffffff811115610a10575f80fd5b610a1c368286016108bc565b60e083015250610a2f6108c08401610963565b61010082015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610a7b57610a7b610a3b565b92915050565b80820180821115610a7b57610a7b610a3b565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ac457610ac4610a3b565b5060010190565b5f8151610adc818560208601610678565b9290920192915050565b5f8351610af7818460208801610678565b9190910191825250602001919050565b5f8351610b18818460208801610678565b60f89390931b7fff00000000000000000000000000000000000000000000000000000000000000169190920190815260010192915050565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b1681525f8a51610b8c816001850160208f01610678565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b16600182850101527fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b16600282850101527fffffffff000000000000000000000000000000000000000000000000000000008960e01b16600a82850101527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600e8285010152610c736022828501018860601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169052565b8560368285010152610cae6056828501018660e01b7fffffffff00000000000000000000000000000000000000000000000000000000169052565b610cbd605a8285010185610acb565b9d9c50505050505050505050505050565b5f8351610cdf818460208801610678565b835190830190610cf3818360208801610678565b0194935050505056fea2646970667358221220a1e9c50eb148023b40cc2831833735d6ddde17c98296b462158fe89bcb08033e64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610034575f3560e01c806304e5557b1461003857806397b1410f14610061575b5f80fd5b61004b6100463660046105fc565b610076565b604051610058919061069a565b60405180910390f35b61007461006f3660046106ea565b61042b565b005b60605f8585604051602001610095929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290505f805b8481101561041f575f8686838181106100e3576100e3610756565b90506020028101906100f59190610783565b6100fe90610972565b90505f825f03610110575060206101a0565b5f5b602081101561019e578888610128600187610a68565b81811061013757610137610756565b90506020028101906101499190610783565b816020811061015a5761015a610756565b6020020135835f0151826020811061017457610174610756565b60200201511461018c57610189816001610a81565b91505b8061019681610a94565b915050610112565b505b6040805160f883901b7fff000000000000000000000000000000000000000000000000000000000000001660208201528151600181830301815260219091019091525f5b8281101561023b5783518290826020811061020157610201610756565b6020020151604051602001610217929190610ae6565b6040516020818303038152906040529150808061023390610a94565b9150506101e4565b506020830151515f9250156102fd57831580610255575084155b1561026357602091506102f8565b5f5b60208110156102f657898961027b600188610a68565b81811061028a5761028a610756565b905060200281019061029c9190610783565b6104000181602081106102b1576102b1610756565b6020020135846020015182602081106102cc576102cc610756565b6020020151146102e4576102e1816001610a81565b92505b806102ee81610a94565b915050610265565b505b600194505b8082604051602001610310929190610b07565b60405160208183030381529060405290505f5b8281101561037c57818460200151826020811061034257610342610756565b6020020151604051602001610358929190610ae6565b6040516020818303038152906040529150808061037490610a94565b915050610323565b505f83610100015161038e575f610391565b60015b6040858101516060870151608088015160a089015160c08a015160e08b0151805187516103d399988c989081901c979096909590949093909291602001610b50565b604051602081830303815290604052905086816040516020016103f7929190610cce565b604051602081830303815290604052965050505050808061041790610a94565b9150506100c8565b50909695505050505050565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000063ccaa2d1163f5efcd798585602082610824376020828101610844376108a486905261092061090452604082015b8183018110156105f157803560f81c80156104c357600181146104e0576104f9565b856003538560081c6002538560101c6001538560181c5f536104f9565b846003538460081c6002538460101c6001538460181c5f535b5060028101906004906001013560f81c60200280838337909101600181019161040001906020903560f81c02808383379190910190610400810190823560f81c9061041701536001820191506008826018830137600882019150606081019050600482601c830137600482019150602081019050601482600c83013760149182019160408201918390604c01376014820191506020810190506020828237602082013560e01c60408201819052602490920191606090910190808383375f9181019190915290810190601f808216602003160161094401622625a05a10156105df575f80fd5b5f80825f808b621e8480f150506104a1565b505050505050505050565b5f805f806060858703121561060f575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610634575f80fd5b818701915087601f830112610647575f80fd5b813581811115610655575f80fd5b8860208260051b8501011115610669575f80fd5b95989497505060200194505050565b5f5b8381101561069257818101518382015260200161067a565b50505f910152565b602081525f82518060208401526106b8816040850160208701610678565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f80602083850312156106fb575f80fd5b823567ffffffffffffffff80821115610712575f80fd5b818501915085601f830112610725575f80fd5b813581811115610733575f80fd5b866020828501011115610744575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7218336030181126107b5575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610120810167ffffffffffffffff81118282101715610810576108106107bf565b60405290565b5f82601f830112610825575f80fd5b60405161040080820182811067ffffffffffffffff8211171561084a5761084a6107bf565b6040528301818582111561085c575f80fd5b845b8281101561087657803582526020918201910161085e565b509195945050505050565b803563ffffffff81168114610894575f80fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610894575f80fd5b5f82601f8301126108cb575f80fd5b813567ffffffffffffffff808211156108e6576108e66107bf565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561092c5761092c6107bf565b81604052838152866020858801011115610944575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80358015158114610894575f80fd5b5f6108e08236031215610983575f80fd5b61098b6107ec565b6109953684610816565b81526109a5366104008501610816565b602082015261080083013560408201526109c26108208401610881565b60608201526109d46108408401610899565b60808201526109e66108608401610899565b60a082015261088083013560c08201526108a083013567ffffffffffffffff811115610a10575f80fd5b610a1c368286016108bc565b60e083015250610a2f6108c08401610963565b61010082015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610a7b57610a7b610a3b565b92915050565b80820180821115610a7b57610a7b610a3b565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ac457610ac4610a3b565b5060010190565b5f8151610adc818560208601610678565b9290920192915050565b5f8351610af7818460208801610678565b9190910191825250602001919050565b5f8351610b18818460208801610678565b60f89390931b7fff00000000000000000000000000000000000000000000000000000000000000169190920190815260010192915050565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b1681525f8a51610b8c816001850160208f01610678565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b16600182850101527fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b16600282850101527fffffffff000000000000000000000000000000000000000000000000000000008960e01b16600a82850101527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600e8285010152610c736022828501018860601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169052565b8560368285010152610cae6056828501018660e01b7fffffffff00000000000000000000000000000000000000000000000000000000169052565b610cbd605a8285010185610acb565b9d9c50505050505050505050505050565b5f8351610cdf818460208801610678565b835190830190610cf3818360208801610678565b0194935050505056fea2646970667358221220a1e9c50eb148023b40cc2831833735d6ddde17c98296b462158fe89bcb08033e64736f6c63430008140033",
+ "bytecode": "0x60c060405234801561000f575f80fd5b50604051610dec380380610dec83398101604081905261002e9161004a565b6001600160a01b0390911660805263ffffffff1660a052610095565b5f806040838503121561005b575f80fd5b82516001600160a01b0381168114610071575f80fd5b602084015190925063ffffffff8116811461008a575f80fd5b809150509250929050565b60805160a051610d366100b65f395f61043601525f6104580152610d365ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806304e5557b1461003857806397b1410f14610061575b5f80fd5b61004b610046366004610600565b610076565b604051610058919061069e565b60405180910390f35b61007461006f3660046106ee565b61042f565b005b60605f8585604051602001610095929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290505f805b84811015610423575f8686838181106100e3576100e361075a565b90506020028101906100f59190610787565b6100fe90610976565b90505f825f03610110575060206101a0565b5f5b602081101561019e578888610128600187610a6c565b8181106101375761013761075a565b90506020028101906101499190610787565b816020811061015a5761015a61075a565b6020020135835f015182602081106101745761017461075a565b60200201511461018c57610189816001610a85565b91505b8061019681610a98565b915050610112565b505b6040805160f883901b7fff000000000000000000000000000000000000000000000000000000000000001660208201528151600181830301815260219091019091525f5b8281101561023b578351829082602081106102015761020161075a565b6020020151604051602001610217929190610aea565b6040516020818303038152906040529150808061023390610a98565b9150506101e4565b5060208301516103e001515f92501561030157831580610259575084155b1561026757602091506102fc565b5f5b60208110156102fa57898961027f600188610a6c565b81811061028e5761028e61075a565b90506020028101906102a09190610787565b6104000181602081106102b5576102b561075a565b6020020135846020015182602081106102d0576102d061075a565b6020020151146102e8576102e5816001610a85565b92505b806102f281610a98565b915050610269565b505b600194505b8082604051602001610314929190610b0b565b60405160208183030381529060405290505f5b828110156103805781846020015182602081106103465761034661075a565b602002015160405160200161035c929190610aea565b6040516020818303038152906040529150808061037890610a98565b915050610327565b505f836101000151610392575f610395565b60015b6040858101516060870151608088015160a089015160c08a015160e08b0151805187516103d799988c989081901c979096909590949093909291602001610b54565b604051602081830303815290604052905086816040516020016103fb929190610cd2565b604051602081830303815290604052965050505050808061041b90610a98565b9150506100c8565b50909695505050505050565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000063ccaa2d1163f5efcd798585602082610824376020828101610844376108a486905261092061090452604082015b8183018110156105f557803560f81c80156104c757600181146104e4576104fd565b856003538560081c6002538560101c6001538560181c5f536104fd565b846003538460081c6002538460101c6001538460181c5f535b5060028101906004906001013560f81c60200280838337909101600181019161040001906020903560f81c02808383379190910190610400810190823560f81c9061041701536001820191506008826018830137600882019150606081019050600482601c830137600482019150602081019050601482600c83013760149182019160408201918390604c01376014820191506020810190506020828237602082013560e01c60408201819052602490920191606090910190808383375f9181019190915290810190601f808216602003160161094401622625a05a10156105e3575f80fd5b5f80825f808b621e8480f150506104a5565b505050505050505050565b5f805f8060608587031215610613575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610638575f80fd5b818701915087601f83011261064b575f80fd5b813581811115610659575f80fd5b8860208260051b850101111561066d575f80fd5b95989497505060200194505050565b5f5b8381101561069657818101518382015260200161067e565b50505f910152565b602081525f82518060208401526106bc81604085016020870161067c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f80602083850312156106ff575f80fd5b823567ffffffffffffffff80821115610716575f80fd5b818501915085601f830112610729575f80fd5b813581811115610737575f80fd5b866020828501011115610748575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7218336030181126107b9575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610120810167ffffffffffffffff81118282101715610814576108146107c3565b60405290565b5f82601f830112610829575f80fd5b60405161040080820182811067ffffffffffffffff8211171561084e5761084e6107c3565b60405283018185821115610860575f80fd5b845b8281101561087a578035825260209182019101610862565b509195945050505050565b803563ffffffff81168114610898575f80fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610898575f80fd5b5f82601f8301126108cf575f80fd5b813567ffffffffffffffff808211156108ea576108ea6107c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610930576109306107c3565b81604052838152866020858801011115610948575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80358015158114610898575f80fd5b5f6108e08236031215610987575f80fd5b61098f6107f0565b610999368461081a565b81526109a936610400850161081a565b602082015261080083013560408201526109c66108208401610885565b60608201526109d8610840840161089d565b60808201526109ea610860840161089d565b60a082015261088083013560c08201526108a083013567ffffffffffffffff811115610a14575f80fd5b610a20368286016108c0565b60e083015250610a336108c08401610967565b61010082015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610a7f57610a7f610a3f565b92915050565b80820180821115610a7f57610a7f610a3f565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ac857610ac8610a3f565b5060010190565b5f8151610ae081856020860161067c565b9290920192915050565b5f8351610afb81846020880161067c565b9190910191825250602001919050565b5f8351610b1c81846020880161067c565b60f89390931b7fff00000000000000000000000000000000000000000000000000000000000000169190920190815260010192915050565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b1681525f8a51610b90816001850160208f0161067c565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b16600182850101527fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b16600282850101527fffffffff000000000000000000000000000000000000000000000000000000008960e01b16600a82850101527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600e8285010152610c776022828501018860601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169052565b8560368285010152610cb26056828501018660e01b7fffffffff00000000000000000000000000000000000000000000000000000000169052565b610cc1605a8285010185610acf565b9d9c50505050505050505050505050565b5f8351610ce381846020880161067c565b835190830190610cf781836020880161067c565b0194935050505056fea26469706673582212208db60002eaedca6cd565e219fe415e1a9fb774ac0cf074924c07a3fcee9fb16964736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610034575f3560e01c806304e5557b1461003857806397b1410f14610061575b5f80fd5b61004b610046366004610600565b610076565b604051610058919061069e565b60405180910390f35b61007461006f3660046106ee565b61042f565b005b60605f8585604051602001610095929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905290505f805b84811015610423575f8686838181106100e3576100e361075a565b90506020028101906100f59190610787565b6100fe90610976565b90505f825f03610110575060206101a0565b5f5b602081101561019e578888610128600187610a6c565b8181106101375761013761075a565b90506020028101906101499190610787565b816020811061015a5761015a61075a565b6020020135835f015182602081106101745761017461075a565b60200201511461018c57610189816001610a85565b91505b8061019681610a98565b915050610112565b505b6040805160f883901b7fff000000000000000000000000000000000000000000000000000000000000001660208201528151600181830301815260219091019091525f5b8281101561023b578351829082602081106102015761020161075a565b6020020151604051602001610217929190610aea565b6040516020818303038152906040529150808061023390610a98565b9150506101e4565b5060208301516103e001515f92501561030157831580610259575084155b1561026757602091506102fc565b5f5b60208110156102fa57898961027f600188610a6c565b81811061028e5761028e61075a565b90506020028101906102a09190610787565b6104000181602081106102b5576102b561075a565b6020020135846020015182602081106102d0576102d061075a565b6020020151146102e8576102e5816001610a85565b92505b806102f281610a98565b915050610269565b505b600194505b8082604051602001610314929190610b0b565b60405160208183030381529060405290505f5b828110156103805781846020015182602081106103465761034661075a565b602002015160405160200161035c929190610aea565b6040516020818303038152906040529150808061037890610a98565b915050610327565b505f836101000151610392575f610395565b60015b6040858101516060870151608088015160a089015160c08a015160e08b0151805187516103d799988c989081901c979096909590949093909291602001610b54565b604051602081830303815290604052905086816040516020016103fb929190610cd2565b604051602081830303815290604052965050505050808061041b90610a98565b9150506100c8565b50909695505050505050565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000063ccaa2d1163f5efcd798585602082610824376020828101610844376108a486905261092061090452604082015b8183018110156105f557803560f81c80156104c757600181146104e4576104fd565b856003538560081c6002538560101c6001538560181c5f536104fd565b846003538460081c6002538460101c6001538460181c5f535b5060028101906004906001013560f81c60200280838337909101600181019161040001906020903560f81c02808383379190910190610400810190823560f81c9061041701536001820191506008826018830137600882019150606081019050600482601c830137600482019150602081019050601482600c83013760149182019160408201918390604c01376014820191506020810190506020828237602082013560e01c60408201819052602490920191606090910190808383375f9181019190915290810190601f808216602003160161094401622625a05a10156105e3575f80fd5b5f80825f808b621e8480f150506104a5565b505050505050505050565b5f805f8060608587031215610613575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610638575f80fd5b818701915087601f83011261064b575f80fd5b813581811115610659575f80fd5b8860208260051b850101111561066d575f80fd5b95989497505060200194505050565b5f5b8381101561069657818101518382015260200161067e565b50505f910152565b602081525f82518060208401526106bc81604085016020870161067c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f80602083850312156106ff575f80fd5b823567ffffffffffffffff80821115610716575f80fd5b818501915085601f830112610729575f80fd5b813581811115610737575f80fd5b866020828501011115610748575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7218336030181126107b9575f80fd5b9190910192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051610120810167ffffffffffffffff81118282101715610814576108146107c3565b60405290565b5f82601f830112610829575f80fd5b60405161040080820182811067ffffffffffffffff8211171561084e5761084e6107c3565b60405283018185821115610860575f80fd5b845b8281101561087a578035825260209182019101610862565b509195945050505050565b803563ffffffff81168114610898575f80fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610898575f80fd5b5f82601f8301126108cf575f80fd5b813567ffffffffffffffff808211156108ea576108ea6107c3565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610930576109306107c3565b81604052838152866020858801011115610948575f80fd5b836020870160208301375f602085830101528094505050505092915050565b80358015158114610898575f80fd5b5f6108e08236031215610987575f80fd5b61098f6107f0565b610999368461081a565b81526109a936610400850161081a565b602082015261080083013560408201526109c66108208401610885565b60608201526109d8610840840161089d565b60808201526109ea610860840161089d565b60a082015261088083013560c08201526108a083013567ffffffffffffffff811115610a14575f80fd5b610a20368286016108c0565b60e083015250610a336108c08401610967565b61010082015292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610a7f57610a7f610a3f565b92915050565b80820180821115610a7f57610a7f610a3f565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610ac857610ac8610a3f565b5060010190565b5f8151610ae081856020860161067c565b9290920192915050565b5f8351610afb81846020880161067c565b9190910191825250602001919050565b5f8351610b1c81846020880161067c565b60f89390931b7fff00000000000000000000000000000000000000000000000000000000000000169190920190815260010192915050565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b1681525f8a51610b90816001850160208f0161067c565b7fff000000000000000000000000000000000000000000000000000000000000008b60f81b16600182850101527fffffffffffffffff0000000000000000000000000000000000000000000000008a60c01b16600282850101527fffffffff000000000000000000000000000000000000000000000000000000008960e01b16600a82850101527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600e8285010152610c776022828501018860601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000169052565b8560368285010152610cb26056828501018660e01b7fffffffff00000000000000000000000000000000000000000000000000000000169052565b610cc1605a8285010185610acf565b9d9c50505050505050505050505050565b5f8351610ce381846020880161067c565b835190830190610cf781836020880161067c565b0194935050505056fea26469706673582212208db60002eaedca6cd565e219fe415e1a9fb774ac0cf074924c07a3fcee9fb16964736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/FflonkVerifier.json b/compiled-contracts/FflonkVerifier.json
index 484680628..f3c6a442c 100644
--- a/compiled-contracts/FflonkVerifier.json
+++ b/compiled-contracts/FflonkVerifier.json
@@ -1,7 +1,7 @@
{
"_format": "hh-sol-artifact-1",
- "contractName": "FflonkVerifier",
- "sourceName": "contracts/verifiers/FflonkVerifier.sol",
+ "contractName": "FflonkVerifier_10",
+ "sourceName": "contracts/verifiers/FflonkVerifier_10.sol",
"abi": [
{
"inputs": [
@@ -28,8 +28,8 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f2b2e45f5cc9fcd40390415fe6f5c6f2f410c781ec6946e45dec011c588e35f7061078082019081527f2564b62a9cb6f1a55f51bda397195f2c0d8ec2c392d46e8563632fc015dfbf906107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f2b2e45f5cc9fcd40390415fe6f5c6f2f410c781ec6946e45dec011c588e35f706103a08501527f2564b62a9cb6f1a55f51bda397195f2c0d8ec2c392d46e8563632fc015dfbf9060206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220f9204a6729ab3cfd7d008e42e9e609c5982c2ce36f4db2fdd5da2d7ad03d505064736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f2b2e45f5cc9fcd40390415fe6f5c6f2f410c781ec6946e45dec011c588e35f7061078082019081527f2564b62a9cb6f1a55f51bda397195f2c0d8ec2c392d46e8563632fc015dfbf906107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f2b2e45f5cc9fcd40390415fe6f5c6f2f410c781ec6946e45dec011c588e35f706103a08501527f2564b62a9cb6f1a55f51bda397195f2c0d8ec2c392d46e8563632fc015dfbf9060206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220f9204a6729ab3cfd7d008e42e9e609c5982c2ce36f4db2fdd5da2d7ad03d505064736f6c63430008140033",
+ "bytecode": "0x608060405234801561000f575f80fd5b506159c7806200001e5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f18c8d7d138b89ce55c3c36770980f5cfb8fd1ff57b35e6b55f89999112db59a061078082019081527f25b738fa77a43d918308eab13fddd19fdc2e32faf94625165ab881fc06e355c26107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f18c8d7d138b89ce55c3c36770980f5cfb8fd1ff57b35e6b55f89999112db59a06103a08501527f25b738fa77a43d918308eab13fddd19fdc2e32faf94625165ab881fc06e355c260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220467f00cf4eecec1435d9b4007eeca03a3c9e923719c63bcd8f583f39684afd3264736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004061003b366004615950565b610054565b604051901515815260200160405180910390f35b5f6158e0565b6040516104c08201518082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610500840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610520840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610620840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061062001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a0840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001840151820990508082526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760840151820990508082526102e4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830960011461050e575f805260205ff35b8091506020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161076085015183099150806107608501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06106a001850151830991508060a06106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806106a001850151830991508060806106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106a001850151830991508060606106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106a001850151830991508060406106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106a001850151830991508060206106a0018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016106a085015183099150806106a08501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606106200185015183099150806060610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406106200185015183099150806040610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206106200185015183099150806020610620018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161062085015183099150806106208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e061052001850151830991508060e0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c061052001850151830991508060c0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a061052001850151830991508060a0610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160806105200185015183099150806080610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160606105200185015183099150806060610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160406105200185015183099150806040610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206105200185015183099150806020610520018501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161052085015183099150806105208501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161050085015183099150806105008501526020830392507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018351830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104e085015183099150806104e085015250806104c0840152505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110610d72575f805260205ff35b50565b803560208201357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760037f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478085860985090891507f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478182099050808214610dfe575f805260205ff35b505050565b610e0d6004610d75565b610e176044610d75565b610e216084610d75565b610e2b60c4610d75565b610e3761010435610d43565b610e4361012435610d43565b610e4f61014435610d43565b610e5b61016435610d43565b610e6761018435610d43565b610e736101a435610d43565b610e7f6101c435610d43565b610e8b6101e435610d43565b610e9761020435610d43565b610ea361022435610d43565b610eaf61024435610d43565b610ebb61026435610d43565b610ec761028435610d43565b610ed36102a435610d43565b610edf6102c435610d43565b610eeb6102e435610d43565b565b7f18c8d7d138b89ce55c3c36770980f5cfb8fd1ff57b35e6b55f89999112db59a061078082019081527f25b738fa77a43d918308eab13fddd19fdc2e32faf94625165ab881fc06e355c26107a0830190815283356107c084019081526004356107e085015260243561080085015260a083207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908190066020808701918252902081900660408601819052845260443590925260643590526060909120819006608083018190529081800960a0830181905260808301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001910960e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8060e0840151096101008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363660e0840151096101208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f1d59376149b959ccbd157ac850893a6f07c2d99b3852513ab8d01be8e846a56660e0840151096101408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000060e0840151096101608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0530d09118705106cbb4a786ead16926d5d174e181a26686af5448492e42a18160e0840151096101808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb60e0840151096101a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f130b17119778465cfb3acaee30f81dee20710ead41671f568b11d9ab07b95a9b60e0840151096101c083015260e08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019080096101e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f7036366101e0840151096102008301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000006101e0840151096102208301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a91758cb49c3517c4604a520cff123608fc9cb6101e0840151096102408301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08301516101e0840151096102608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f23610260840151096102808301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd610260840151096102a08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f283ce45a2e5b8e4e78f9fbaf5f6a348bfcfaf76dd28e5ca7121b74ef68fdec2e610260840151096102c08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029048b6e193fd84104cc37a73fec2bc5e9b8ca0b2d36636f236102c0840151096102e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000177b3c4d79d41a917585bfc41088d8daaa78b17ea66b99c90dd6102c0840151096103008301526102608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081818009098060c08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018182097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000909101066104a084018190526104c0840152506107808201526101e06101046107a083013761020061078082019081207f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019081900680845282526084356107a084015260a4356107c08401526060918290200691015250565b60e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018160080960e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105208601526101c08501516101008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105408601526101a08501516101208601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105608601526101808501516101408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961058086015261016085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105a08601526101408501516101808601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105c08601526101208501516101a08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096105e08601526101008501516101c08601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830960e0610520018601525050505050565b6101e0810151606082015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001816004096101e0850151935090507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183810381900683087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106208601526102408501516102008601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828609830961064086015261022085015193507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096106608601526102008501516102408601519094507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006840890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082860983096060610620018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c0870151097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030660c0850151087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850151600309096102608301517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181810381900684087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106a08601526102a08501516102808601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096106c08601526102808501516102a08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960406106a0018601527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c08801517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103067f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08a015109087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c0880151600309096102c086015190935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001828103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107008601526103008501516102e08601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840984096107208601526102e08501516103008601519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103819006850890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828409840960a06106a0018601525050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806101e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806104e08401527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102608501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016102e08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016103008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840882099050806105008401526127f583611944565b6127fe83611d8c565b61280783611fa2565b505060c081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000083018190066301000000096107608401525050610d728161005a565b6104a08101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181610760840151096107608301525050565b5f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185356107608601510983030106905080610320830152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820860e08301519091505f9081807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f61052001890151880984098508935061010086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001602061052001890151880984098508935061012086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001604061052001890151880984098508935061014086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001606061052001890151880984098508935061016086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001608061052001890151880984098508935061018086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a06105200189015188098409850893506101a086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c06105200189015188098409850893506101c086015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180846101243509610104350891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101443509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101843509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101a43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101c43509830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101e4350983089150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160e0610520018801518709830984089250505080610340840152505050565b600160608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183099150507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306820890505f6102043561022435610244357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183610104350993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180836101243509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018486096101443509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180826101643509850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161018435850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610320870151850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c087015185096101e08701519094505f908490827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f02610620018d01518c098509850893508692506102008a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600102610620018d01518c098509850893508692506102208a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185850909840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600202610620018d01518c098509850893508692506102408a015191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878409840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180868309840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180897f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001858509098408925050507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016020600302610620018b01518a09830983089150508061036088015250505050505050565b606081015160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818309905060017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181840990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60c08901510908820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306830860c08501519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190817f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b82090990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089150505f91505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160c085015160208601510960408501517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180828408610204350892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028709086102243508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160038709086102443508840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161026435840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180827f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a43560208b01510908610204350894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c43560208c015109086102243508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e43560208c015109086102443508860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161028435860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010306840892507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151840992506001610264350394507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610760870151860994507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016104c0870151860961026087015190955091505f9050807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160205f026106a0018a0151880983098308915061028087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206001026106a0018a015188098309830891506102a087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180878509610264350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180857f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206002026106a0018a015188098309830891506102c087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206003026106a0018a015188098309830891506102e087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206004026106a0018a0151880983098308915061030087015192507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102a4358509610284350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806102c4357f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186870909820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160206005026106a0018a015188098309830891505080610380870152505050505050565b6040518151815260208201516020820152825160408201526020830151606082015260408260808360066107d05a03fa905080610dfe575f805260205ff35b5f604051833581526020840135602082015284604082015260408160608360076107d05a03fa915081615135575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa91505080615164575f805260205ff35b50505050565b5f60405183815284602082015285604082015260408160608360076107d05a03fa91508161519a575f805260205ff35b825160408201526020830151606082015260408360808360066107d05a03fa915050806151c9575f805260205ff35b5050505050565b60608101517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018060e08401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001030682087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101008601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101208601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101408601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101608601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08601517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103068408820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001806104e0850151830984510991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000180610500850151830984517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908009097f18c8d7d138b89ce55c3c36770980f5cfb8fd1ff57b35e6b55f89999112db59a06103a08501527f25b738fa77a43d918308eab13fddd19fdc2e32faf94625165ab881fc06e355c260206103a0018501526156208360046103a08701615100565b6156308160446103a08701615100565b6156bd7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161038088015185097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161036089015188090861034087015108600260016103e0880161516a565b50610dfe8160846104208601615100565b604051610400820180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479081038190069091526104408301805182039190910690525f906157256103e084016103a085016150c1565b61573761042084016103a085016150c1565b61574b606084015160c46103a08601615100565b6103a083015181526103c08301516020808301919091527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a083015260c43560c08301527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760e43581030660e08301527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d6101008301527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e6101208301527f1970ea81dd6992adfbc571effb03503adbbb6a857f578403c6c40e22d65b3c026101408301527f054793348f12c0cf5622c340573cb277586319de359ab9389778f689786b1e48610160830152816101808160086107d05a03fa90511692915050565b60405161078081016040526158f3610e03565b6158fd8382610eed565b615906816123ad565b61590f8161286e565b61591983826128a7565b61592281612906565b61592b81613e54565b61593481614549565b61593d816151d0565b615946816156ce565b9050805f5260205ff35b5f80610320808486031215615963575f80fd5b610300840185811115615974575f80fd5b849350858286011115615985575f80fd5b8092505050925092905056fea2646970667358221220467f00cf4eecec1435d9b4007eeca03a3c9e923719c63bcd8f583f39684afd3264736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/GlobalExitRootManagerL2SovereignChain.json b/compiled-contracts/GlobalExitRootManagerL2SovereignChain.json
new file mode 100644
index 000000000..1bd52c6dc
--- /dev/null
+++ b/compiled-contracts/GlobalExitRootManagerL2SovereignChain.json
@@ -0,0 +1,284 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "GlobalExitRootManagerL2SovereignChain",
+ "sourceName": "contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_bridgeAddress",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyAllowedContracts",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newGlobalExitRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "InsertGlobalExitRoot",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "removedGlobalExitRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RemoveLastGlobalExitRoot",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newGlobalExitRootRemover",
+ "type": "address"
+ }
+ ],
+ "name": "SetGlobalExitRootRemover",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newGlobalExitRootUpdater",
+ "type": "address"
+ }
+ ],
+ "name": "SetGlobalExitRootUpdater",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "bridgeAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "globalExitRootMap",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "globalExitRootRemover",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "globalExitRootUpdater",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_globalExitRootUpdater",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_globalExitRootRemover",
+ "type": "address"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "_newRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "insertGlobalExitRoot",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "insertedGERCount",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lastRollupExitRoot",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32[]",
+ "name": "gersToRemove",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "removeLastGlobalExitRoots",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_globalExitRootRemover",
+ "type": "address"
+ }
+ ],
+ "name": "setGlobalExitRootRemover",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_globalExitRootUpdater",
+ "type": "address"
+ }
+ ],
+ "name": "setGlobalExitRootUpdater",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "newRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "updateExitRoot",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x60a060405234801561000f575f80fd5b50604051610c89380380610c8983398101604081905261002e91610109565b6001600160a01b038116608052610043610049565b50610136565b603454610100900460ff16156100b55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60345460ff9081161015610107576034805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610119575f80fd5b81516001600160a01b038116811461012f575f80fd5b9392505050565b608051610b346101555f395f81816101e801526103820152610b345ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80636da0e4ab1161007d57806391eb796d1161005857806391eb796d146101c3578063a3c573eb146101e3578063d0267f391461020a575f80fd5b80636da0e4ab1461015c5780637c314ce31461016f5780638bd0eb1c146101ba575f80fd5b806333d6247d116100ad57806333d6247d14610123578063485cc9551461013657806357dfb57214610149575f80fd5b806301fd9044146100d357806312da06b2146100ef578063257b363214610104575b5f80fd5b6100dc60015481565b6040519081526020015b60405180910390f35b6101026100fd36600461093a565b61021d565b005b6100dc61011236600461093a565b5f6020819052908152604090205481565b61010261013136600461093a565b61036a565b610102610144366004610979565b6103de565b6101026101573660046109aa565b6105ea565b61010261016a366004610a19565b61074e565b6034546101959062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b6100dc60365481565b6035546101959073ffffffffffffffffffffffffffffffffffffffff1681565b6101957f000000000000000000000000000000000000000000000000000000000000000081565b610102610218366004610a19565b61087c565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff1661027e57413314610279576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102d5565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff1633146102d5576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604081205490036103385760365f81546102f790610a66565b91829055505f8281526020819052604080822092909255905182917fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d591a250565b6040517f1f97a58200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103d9576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b603454610100900460ff16158080156103fe5750603454600160ff909116105b806104185750303b158015610418575060345460ff166001145b6104a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561050657603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603480547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155603580547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905580156105e557603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60355473ffffffffffffffffffffffffffffffffffffffff16331461063b576040517fa34ddeb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60365480821115610678576040517f56feb4f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015610746575f84848381811061069557610695610a9d565b9050602002013590505f805f8381526020019081526020015f205490508381146106eb576040517fae765ff600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152602081905260408120558361070381610aca565b6040519095508391507f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a2905f90a25050808061073e90610a66565b91505061067a565b506036555050565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff166107af574133146107aa576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff163314610806576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603480547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040517f992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c905f90a250565b60355473ffffffffffffffffffffffffffffffffffffffff1633146108cd576040517fa34ddeb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517eb4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758905f90a250565b5f6020828403121561094a575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610974575f80fd5b919050565b5f806040838503121561098a575f80fd5b61099383610951565b91506109a160208401610951565b90509250929050565b5f80602083850312156109bb575f80fd5b823567ffffffffffffffff808211156109d2575f80fd5b818501915085601f8301126109e5575f80fd5b8135818111156109f3575f80fd5b8660208260051b8501011115610a07575f80fd5b60209290920196919550909350505050565b5f60208284031215610a29575f80fd5b610a3282610951565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a9657610a96610a39565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81610ad857610ad8610a39565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220eaeb96edcd68aaace0b150250759e33e52bda31e20946c3877825cec6f50572564736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80636da0e4ab1161007d57806391eb796d1161005857806391eb796d146101c3578063a3c573eb146101e3578063d0267f391461020a575f80fd5b80636da0e4ab1461015c5780637c314ce31461016f5780638bd0eb1c146101ba575f80fd5b806333d6247d116100ad57806333d6247d14610123578063485cc9551461013657806357dfb57214610149575f80fd5b806301fd9044146100d357806312da06b2146100ef578063257b363214610104575b5f80fd5b6100dc60015481565b6040519081526020015b60405180910390f35b6101026100fd36600461093a565b61021d565b005b6100dc61011236600461093a565b5f6020819052908152604090205481565b61010261013136600461093a565b61036a565b610102610144366004610979565b6103de565b6101026101573660046109aa565b6105ea565b61010261016a366004610a19565b61074e565b6034546101959062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e6565b6100dc60365481565b6035546101959073ffffffffffffffffffffffffffffffffffffffff1681565b6101957f000000000000000000000000000000000000000000000000000000000000000081565b610102610218366004610a19565b61087c565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff1661027e57413314610279576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102d5565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff1633146102d5576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604081205490036103385760365f81546102f790610a66565b91829055505f8281526020819052604080822092909255905182917fb1b866fe5fac68e8f1a4ab2520c7a6b493a954934bbd0f054bd91d6674a4c0d591a250565b6040517f1f97a58200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146103d9576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b603454610100900460ff16158080156103fe5750603454600160ff909116105b806104185750303b158015610418575060345460ff166001145b6104a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561050657603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603480547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155603580547fffffffffffffffffffffffff00000000000000000000000000000000000000001691841691909117905580156105e557603480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60355473ffffffffffffffffffffffffffffffffffffffff16331461063b576040517fa34ddeb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60365480821115610678576040517f56feb4f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015610746575f84848381811061069557610695610a9d565b9050602002013590505f805f8381526020019081526020015f205490508381146106eb576040517fae765ff600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152602081905260408120558361070381610aca565b6040519095508391507f605764d0b65b62ecf05dc90f674a00a2e2531fabaf120fdde65790e407fcb7a2905f90a25050808061073e90610a66565b91505061067a565b506036555050565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff166107af574133146107aa576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806565b60345462010000900473ffffffffffffffffffffffffffffffffffffffff163314610806576040517fc758fc1a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603480547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040517f992b80814dbc3fba903486d81daddb07d1d5b20483742458c8b0540e3a37e37c905f90a250565b60355473ffffffffffffffffffffffffffffffffffffffff1633146108cd576040517fa34ddeb100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517eb4672b6135d1dfbd4e9520e01abb14ea5eac645990b0d24dfda00ae999b758905f90a250565b5f6020828403121561094a575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610974575f80fd5b919050565b5f806040838503121561098a575f80fd5b61099383610951565b91506109a160208401610951565b90509250929050565b5f80602083850312156109bb575f80fd5b823567ffffffffffffffff808211156109d2575f80fd5b818501915085601f8301126109e5575f80fd5b8135818111156109f3575f80fd5b8660208260051b8501011115610a07575f80fd5b60209290920196919550909350505050565b5f60208284031215610a29575f80fd5b610a3282610951565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a9657610a96610a39565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81610ad857610ad8610a39565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220eaeb96edcd68aaace0b150250759e33e52bda31e20946c3877825cec6f50572564736f6c63430008140033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/compiled-contracts/PolygonPessimisticConsensus.json b/compiled-contracts/PolygonPessimisticConsensus.json
new file mode 100644
index 000000000..7bd077919
--- /dev/null
+++ b/compiled-contracts/PolygonPessimisticConsensus.json
@@ -0,0 +1,704 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "PolygonPessimisticConsensus",
+ "sourceName": "contracts/v2/consensus/pessimistic/PolygonPessimisticConsensus.sol",
+ "abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "contract IPolygonZkEVMGlobalExitRootV2",
+ "name": "_globalExitRootManager",
+ "type": "address"
+ },
+ {
+ "internalType": "contract IERC20Upgradeable",
+ "name": "_pol",
+ "type": "address"
+ },
+ {
+ "internalType": "contract IPolygonZkEVMBridgeV2",
+ "name": "_bridgeAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "contract PolygonRollupManager",
+ "name": "_rollupManager",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "BatchAlreadyVerified",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "BatchNotSequencedOrNotSequenceEnd",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ExceedMaxVerifyBatches",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalAccInputHashDoesNotMatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalNumBatchBelowLastVerifiedBatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalNumBatchDoesNotMatchPendingState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalPendingStateNumInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchNotAllowed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchTimeoutNotExpired",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchesAlreadyActive",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchesDecentralized",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchesNotAllowedOnEmergencyState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForceBatchesOverflow",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ForcedDataDoesNotMatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GasTokenNetworkMustBeZeroOnEther",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "GlobalExitRootNotExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "HaltTimeoutNotExpired",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "HaltTimeoutNotExpiredAfterEmergencyState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "HugeTokenMetadataNotSupported",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitNumBatchAboveLastVerifiedBatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitNumBatchDoesNotMatchPendingState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitSequencedBatchDoesNotMatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitializeTransaction",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidProof",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeBatchTimeTarget",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeForceBatchTimeout",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeMultiplierBatchFee",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MaxTimestampSequenceInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NewAccInputHashDoesNotExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NewPendingStateTimeoutMustBeLower",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NewStateRootNotInsidePrime",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NewTrustedAggregatorTimeoutMustBeLower",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughMaticAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughPOLAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OldAccInputHashDoesNotExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OldStateRootDoesNotExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyPendingAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyRollupManager",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyTrustedAggregator",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyTrustedSequencer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PendingStateDoesNotExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PendingStateInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PendingStateNotConsolidable",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "PendingStateTimeoutExceedHaltAggregationTimeout",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SequenceZeroBatches",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SequencedTimestampBelowForcedTimestamp",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SequencedTimestampInvalid",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "StoredRootMustBeDifferentThanNewRoot",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TransactionsLengthAboveMax",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TrustedAggregatorTimeoutExceedHaltAggregationTimeout",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "TrustedAggregatorTimeoutNotExpired",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AcceptAdminRole",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newTrustedSequencer",
+ "type": "address"
+ }
+ ],
+ "name": "SetTrustedSequencer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "newTrustedSequencerURL",
+ "type": "string"
+ }
+ ],
+ "name": "SetTrustedSequencerURL",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "newPendingAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "TransferAdminRole",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "CONSENSUS_TYPE",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "acceptAdminRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "admin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "bridgeAddress",
+ "outputs": [
+ {
+ "internalType": "contract IPolygonZkEVMBridgeV2",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "forceBatchAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "forceBatchTimeout",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "name": "forcedBatches",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "gasTokenAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "gasTokenNetwork",
+ "outputs": [
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getConsensusHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "globalExitRootManager",
+ "outputs": [
+ {
+ "internalType": "contract IPolygonZkEVMGlobalExitRootV2",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_admin",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "sequencer",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
+ },
+ {
+ "internalType": "address",
+ "name": "_gasTokenAddress",
+ "type": "address"
+ },
+ {
+ "internalType": "string",
+ "name": "sequencerURL",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "_networkName",
+ "type": "string"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lastAccInputHash",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lastForceBatch",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "lastForceBatchSequenced",
+ "outputs": [
+ {
+ "internalType": "uint64",
+ "name": "",
+ "type": "uint64"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "networkName",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingAdmin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pol",
+ "outputs": [
+ {
+ "internalType": "contract IERC20Upgradeable",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "rollupManager",
+ "outputs": [
+ {
+ "internalType": "contract PolygonRollupManager",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newTrustedSequencer",
+ "type": "address"
+ }
+ ],
+ "name": "setTrustedSequencer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "newTrustedSequencerURL",
+ "type": "string"
+ }
+ ],
+ "name": "setTrustedSequencerURL",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newPendingAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "transferAdminRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "trustedSequencer",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "trustedSequencerURL",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x61010060405234801562000011575f80fd5b506040516200118638038062001186833981016040819052620000349162000146565b6001600160a01b0380851660a05280841660805280831660c052811660e05283838383620000616200006f565b5050505050505050620001ab565b5f54610100900460ff1615620000db5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200012c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000143575f80fd5b50565b5f805f80608085870312156200015a575f80fd5b845162000167816200012e565b60208601519094506200017a816200012e565b60408601519093506200018d816200012e565b6060860151909250620001a0816200012e565b939692955090935050565b60805160a05160c05160e051610fa0620001e65f395f81816102b1015261062b01525f61034601525f61043e01525f6104650152610fa05ff3fe608060405234801561000f575f80fd5b506004361061018f575f3560e01c80638c3d7301116100dd578063cea5a4c011610088578063e46761c411610063578063e46761c414610460578063e7a7ed0214610487578063f851a4401461049b575f80fd5b8063cea5a4c014610412578063cfa8ed4714610419578063d02103ca14610439575f80fd5b8063ada8f919116100b8578063ada8f919146103c4578063c754c7ed146103d7578063c89e42df146103ff575f80fd5b80638c3d730114610339578063a3c573eb14610341578063ad1edf3414610368575f80fd5b806349b7b8021161013d5780636e05d2cd116101185780636e05d2cd146103085780636ff512cc146103115780637125702214610326575f80fd5b806349b7b802146102ac578063542028d5146102d35780636b8616ce146102db575f80fd5b80633c351e101161016d5780633c351e10146102165780633cbc795b146102365780634560526714610273575f80fd5b8063107bf28c1461019357806326782247146101b15780632c111c06146101f6575b5f80fd5b61019b6104c0565b6040516101a89190610b24565b60405180910390f35b6001546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a8565b6008546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b6009546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b60095461025e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101a8565b6007546102939068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a8565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b61019b61054c565b6102fa6102e9366004610b8d565b60066020525f908152604090205481565b6040519081526020016101a8565b6102fa60055481565b61032461031f366004610be3565b610559565b005b610324610334366004610cd0565b610629565b6103246108fb565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6002546040515f6020820181905260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602482015260380160405160208183030381529060405280519060200120905090565b6103246103d2366004610be3565b6109cd565b60075461029390700100000000000000000000000000000000900467ffffffffffffffff1681565b61032461040d366004610d79565b610a96565b61025e5f81565b6002546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6007546102939067ffffffffffffffff1681565b5f546101d19062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b600480546104cd90610db3565b80601f01602080910402602001604051908101604052809291908181526020018280546104f990610db3565b80156105445780601f1061051b57610100808354040283529160200191610544565b820191905f5260205f20905b81548152906001019060200180831161052757829003601f168201915b505050505081565b600380546104cd90610db3565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146105af576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020015b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610698576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156106b657505f54600160ff909116105b806106cf5750303b1580156106cf57505f5460ff166001145b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156107bb575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036108428482610e52565b50600461084f8382610e52565b50600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861617905580156108f2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461094c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a23576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce69060200161061e565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003610af88282610e52565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b208160405161061e91905b5f6020808352835180828501525f5b81811015610b4f57858101830151858201604001528201610b33565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610b9d575f80fd5b813567ffffffffffffffff81168114610bb4575f80fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bde575f80fd5b919050565b5f60208284031215610bf3575f80fd5b610bb482610bbb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610c38575f80fd5b813567ffffffffffffffff80821115610c5357610c53610bfc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610c9957610c99610bfc565b81604052838152866020858801011115610cb1575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f8060c08789031215610ce5575f80fd5b610cee87610bbb565b9550610cfc60208801610bbb565b9450604087013563ffffffff81168114610d14575f80fd5b9350610d2260608801610bbb565b9250608087013567ffffffffffffffff80821115610d3e575f80fd5b610d4a8a838b01610c29565b935060a0890135915080821115610d5f575f80fd5b50610d6c89828a01610c29565b9150509295509295509295565b5f60208284031215610d89575f80fd5b813567ffffffffffffffff811115610d9f575f80fd5b610dab84828501610c29565b949350505050565b600181811c90821680610dc757607f821691505b602082108103610dfe577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e4d575f81815260208120601f850160051c81016020861015610e2a5750805b601f850160051c820191505b81811015610e4957828155600101610e36565b5050505b505050565b815167ffffffffffffffff811115610e6c57610e6c610bfc565b610e8081610e7a8454610db3565b84610e04565b602080601f831160018114610ed2575f8415610e9c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610e49565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015610f1e57888601518255948401946001909101908401610eff565b5085821015610f5a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220ad794faf9e0b5c82ead50a6f1b5e27f7ada7ec4545266c0d28c66461e04b1b3e64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061018f575f3560e01c80638c3d7301116100dd578063cea5a4c011610088578063e46761c411610063578063e46761c414610460578063e7a7ed0214610487578063f851a4401461049b575f80fd5b8063cea5a4c014610412578063cfa8ed4714610419578063d02103ca14610439575f80fd5b8063ada8f919116100b8578063ada8f919146103c4578063c754c7ed146103d7578063c89e42df146103ff575f80fd5b80638c3d730114610339578063a3c573eb14610341578063ad1edf3414610368575f80fd5b806349b7b8021161013d5780636e05d2cd116101185780636e05d2cd146103085780636ff512cc146103115780637125702214610326575f80fd5b806349b7b802146102ac578063542028d5146102d35780636b8616ce146102db575f80fd5b80633c351e101161016d5780633c351e10146102165780633cbc795b146102365780634560526714610273575f80fd5b8063107bf28c1461019357806326782247146101b15780632c111c06146101f6575b5f80fd5b61019b6104c0565b6040516101a89190610b24565b60405180910390f35b6001546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a8565b6008546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b6009546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b60095461025e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101a8565b6007546102939068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a8565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b61019b61054c565b6102fa6102e9366004610b8d565b60066020525f908152604090205481565b6040519081526020016101a8565b6102fa60055481565b61032461031f366004610be3565b610559565b005b610324610334366004610cd0565b610629565b6103246108fb565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6102fa6002546040515f6020820181905260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602482015260380160405160208183030381529060405280519060200120905090565b6103246103d2366004610be3565b6109cd565b60075461029390700100000000000000000000000000000000900467ffffffffffffffff1681565b61032461040d366004610d79565b610a96565b61025e5f81565b6002546101d19073ffffffffffffffffffffffffffffffffffffffff1681565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6101d17f000000000000000000000000000000000000000000000000000000000000000081565b6007546102939067ffffffffffffffff1681565b5f546101d19062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b600480546104cd90610db3565b80601f01602080910402602001604051908101604052809291908181526020018280546104f990610db3565b80156105445780601f1061051b57610100808354040283529160200191610544565b820191905f5260205f20905b81548152906001019060200180831161052757829003601f168201915b505050505081565b600380546104cd90610db3565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146105af576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020015b60405180910390a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610698576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156106b657505f54600160ff909116105b806106cf5750303b1580156106cf57505f5460ff166001145b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156107bb575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000073ffffffffffffffffffffffffffffffffffffffff8a81169190910291909117909155600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001691881691909117905560036108428482610e52565b50600461084f8382610e52565b50600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861617905580156108f2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461094c576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a23576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce69060200161061e565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003610af88282610e52565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b208160405161061e91905b5f6020808352835180828501525f5b81811015610b4f57858101830151858201604001528201610b33565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215610b9d575f80fd5b813567ffffffffffffffff81168114610bb4575f80fd5b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610bde575f80fd5b919050565b5f60208284031215610bf3575f80fd5b610bb482610bbb565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610c38575f80fd5b813567ffffffffffffffff80821115610c5357610c53610bfc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610c9957610c99610bfc565b81604052838152866020858801011115610cb1575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f8060c08789031215610ce5575f80fd5b610cee87610bbb565b9550610cfc60208801610bbb565b9450604087013563ffffffff81168114610d14575f80fd5b9350610d2260608801610bbb565b9250608087013567ffffffffffffffff80821115610d3e575f80fd5b610d4a8a838b01610c29565b935060a0890135915080821115610d5f575f80fd5b50610d6c89828a01610c29565b9150509295509295509295565b5f60208284031215610d89575f80fd5b813567ffffffffffffffff811115610d9f575f80fd5b610dab84828501610c29565b949350505050565b600181811c90821680610dc757607f821691505b602082108103610dfe577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e4d575f81815260208120601f850160051c81016020861015610e2a5750805b601f850160051c820191505b81811015610e4957828155600101610e36565b5050505b505050565b815167ffffffffffffffff811115610e6c57610e6c610bfc565b610e8081610e7a8454610db3565b84610e04565b602080601f831160018114610ed2575f8415610e9c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610e49565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015610f1e57888601518255948401946001909101908401610eff565b5085821015610f5a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220ad794faf9e0b5c82ead50a6f1b5e27f7ada7ec4545266c0d28c66461e04b1b3e64736f6c63430008140033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/compiled-contracts/PolygonRollupManager.json b/compiled-contracts/PolygonRollupManager.json
index ee90e4f69..51ffd6dd3 100644
--- a/compiled-contracts/PolygonRollupManager.json
+++ b/compiled-contracts/PolygonRollupManager.json
@@ -34,6 +34,16 @@
"name": "AddressDoNotHaveRequiredRole",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "AllBatchesMustBeVerified",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AllSequencedMustBeVerified",
+ "type": "error"
+ },
{
"inputs": [],
"name": "AllzkEVMSequencedBatchesMustBeVerified",
@@ -44,11 +54,26 @@
"name": "BatchFeeOutOfRange",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "CannotUpdateWithUnconsolidatedPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ChainIDAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "ChainIDOutOfRange",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EmptyVerifySequencesData",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ExceedMaxVerifyBatches",
@@ -64,6 +89,16 @@
"name": "FinalNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceBelowLastVerifiedSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceDoesNotMatchPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalPendingStateNumInvalid",
@@ -89,6 +124,21 @@
"name": "InitNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InitSequenceMustMatchCurrentForkID",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitSequenceNumDoesNotMatchPendingState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidPessimisticProof",
+ "type": "error"
+ },
{
"inputs": [],
"name": "InvalidProof",
@@ -104,11 +154,46 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InvalidRangeMultiplierZkGasPrice",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeSequenceTimeTarget",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollupType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidVerifierType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MustSequenceSomeBatch",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "MustSequenceSomeBlob",
+ "type": "error"
+ },
{
"inputs": [],
"name": "NewAccInputHashDoesNotExist",
@@ -129,6 +214,11 @@
"name": "NewTrustedAggregatorTimeoutMustBeLower",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "NotAllowedAddress",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OldAccInputHashDoesNotExist",
@@ -139,6 +229,11 @@
"name": "OldStateRootDoesNotExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyChainsWithPessimisticProofs",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyEmergencyState",
@@ -149,6 +244,16 @@
"name": "OnlyNotEmergencyState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyRollupAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyStateTransitionChains",
+ "type": "error"
+ },
{
"inputs": [],
"name": "PendingStateDoesNotExist",
@@ -164,11 +269,31 @@
"name": "PendingStateNotConsolidable",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "PendingStateNumExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotEndOfSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotValid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupAddressAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "RollupIDNotAscendingOrder",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupMustExist",
@@ -204,11 +329,21 @@
"name": "UpdateNotCompatible",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "UpdateToOldRollupTypeID",
+ "type": "error"
+ },
{
"inputs": [],
"name": "UpdateToSameRollupTypeID",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "zkGasPriceOfRange",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -238,8 +373,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -247,6 +382,12 @@
"internalType": "uint64",
"name": "lastVerifiedBatchBeforeUpgrade",
"type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "AddExistingRollup",
@@ -281,8 +422,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -296,46 +437,15 @@
"internalType": "string",
"name": "description",
"type": "string"
- }
- ],
- "name": "AddNewRollupType",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
- "name": "exitRoot",
+ "name": "programVKey",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
}
],
- "name": "ConsolidatePendingState",
+ "name": "AddNewRollupType",
"type": "event"
},
{
@@ -432,62 +542,6 @@
"name": "OnSequenceBatches",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
- }
- ],
- "name": "OverridePendingState",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "storedStateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "provedStateRoot",
- "type": "bytes32"
- }
- ],
- "name": "ProveNonDeterministicPendingState",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [
@@ -567,26 +621,25 @@
"anonymous": false,
"inputs": [
{
- "indexed": false,
- "internalType": "uint256",
- "name": "newBatchFee",
- "type": "uint256"
- }
- ],
- "name": "SetBatchFee",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
{
"indexed": false,
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
}
],
- "name": "SetMultiplierBatchFee",
+ "name": "RollbackBatches",
"type": "event"
},
{
@@ -594,12 +647,12 @@
"inputs": [
{
"indexed": false,
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
+ "internalType": "uint256",
+ "name": "newBatchFee",
+ "type": "uint256"
}
],
- "name": "SetPendingStateTimeout",
+ "name": "SetBatchFee",
"type": "event"
},
{
@@ -618,14 +671,26 @@
{
"anonymous": false,
"inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "newRollupTypeID",
+ "type": "uint32"
+ },
{
"indexed": false,
"internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
+ "name": "lastVerifiedBatchBeforeUpgrade",
"type": "uint64"
}
],
- "name": "SetTrustedAggregatorTimeout",
+ "name": "UpdateRollup",
"type": "event"
},
{
@@ -633,12 +698,12 @@
"inputs": [
{
"indexed": false,
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
+ "internalType": "string",
+ "name": "rollupManagerVersion",
+ "type": "string"
}
],
- "name": "SetVerifyBatchTimeTarget",
+ "name": "UpdateRollupManagerVersion",
"type": "event"
},
{
@@ -652,34 +717,9 @@
},
{
"indexed": false,
- "internalType": "uint32",
- "name": "newRollupTypeID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "lastVerifiedBatchBeforeUpgrade",
- "type": "uint64"
- }
- ],
- "name": "UpdateRollup",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
+ "internalType": "uint64",
+ "name": "numBatch",
+ "type": "uint64"
},
{
"indexed": false,
@@ -700,54 +740,30 @@
"type": "address"
}
],
- "name": "VerifyBatches",
+ "name": "VerifyBatchesTrustedAggregator",
"type": "event"
},
{
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
{
- "indexed": false,
"internalType": "bytes32",
- "name": "exitRoot",
+ "name": "",
"type": "bytes32"
- },
- {
- "indexed": true,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
}
],
- "name": "VerifyBatchesTrustedAggregator",
- "type": "event"
+ "stateMutability": "view",
+ "type": "function"
},
{
"inputs": [],
- "name": "DEFAULT_ADMIN_ROLE",
+ "name": "ROLLUP_MANAGER_VERSION",
"outputs": [
{
- "internalType": "bytes32",
+ "internalType": "string",
"name": "",
- "type": "bytes32"
+ "type": "string"
}
],
"stateMutability": "view",
@@ -768,7 +784,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -784,13 +800,18 @@
},
{
"internalType": "bytes32",
- "name": "genesis",
+ "name": "initRoot",
"type": "bytes32"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addExistingRollup",
@@ -806,7 +827,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -816,8 +837,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -829,6 +850,11 @@
"internalType": "string",
"name": "description",
"type": "string"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addNewRollupType",
@@ -881,24 +907,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "consolidatePendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [
{
@@ -975,6 +983,40 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "l1InfoTreeRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newPessimisticRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getInputPessimisticBytes",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -1094,52 +1136,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "batchNum",
- "type": "uint64"
- }
- ],
- "name": "getRollupPendingStateTransitions",
- "outputs": [
- {
- "components": [
- {
- "internalType": "uint64",
- "name": "timestamp",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- }
- ],
- "internalType": "struct LegacyZKEVMStateVariables.PendingState",
- "name": "",
- "type": "tuple"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1237,58 +1233,7 @@
"type": "function"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "trustedAggregator",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "_pendingStateTimeout",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "_trustedAggregatorTimeout",
- "type": "uint64"
- },
- {
- "internalType": "address",
- "name": "admin",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "timelock",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "emergencyCouncil",
- "type": "address"
- },
- {
- "internalType": "contract PolygonZkEVMExistentEtrog",
- "name": "polygonZkEVM",
- "type": "address"
- },
- {
- "internalType": "contract IVerifierRollup",
- "name": "zkEVMVerifier",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "zkEVMForkID",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "zkEVMChainID",
- "type": "uint64"
- }
- ],
+ "inputs": [],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
@@ -1307,30 +1252,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "isPendingStateConsolidable",
- "outputs": [
- {
- "internalType": "bool",
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [],
"name": "lastAggregationTimestamp",
@@ -1357,19 +1278,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "multiplierBatchFee",
- "outputs": [
- {
- "internalType": "uint16",
- "name": "",
- "type": "uint16"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1407,124 +1315,33 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "pol",
+ "outputs": [
+ {
+ "internalType": "contract IERC20Upgradeable",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "newLocalExitRoot",
- "type": "bytes32"
- },
{
"internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "role",
"type": "bytes32"
},
{
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
- }
- ],
- "name": "overridePendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "pendingStateTimeout",
- "outputs": [
- {
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "pol",
- "outputs": [
- {
- "internalType": "contract IERC20Upgradeable",
- "name": "",
+ "internalType": "address",
+ "name": "account",
"type": "address"
}
],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "newLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "newStateRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
- }
- ],
- "name": "proveNonDeterministicPendingState",
+ "name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1542,7 +1359,7 @@
"type": "address"
}
],
- "name": "renounceRole",
+ "name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1550,17 +1367,17 @@
{
"inputs": [
{
- "internalType": "bytes32",
- "name": "role",
- "type": "bytes32"
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
},
{
- "internalType": "address",
- "name": "account",
- "type": "address"
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
}
],
- "name": "revokeRole",
+ "name": "rollbackBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1608,64 +1425,152 @@
"name": "rollupIDToRollupData",
"outputs": [
{
- "internalType": "contract IPolygonRollupBase",
- "name": "rollupContract",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "chainID",
- "type": "uint64"
- },
- {
- "internalType": "contract IVerifierRollup",
- "name": "verifier",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "forkID",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "lastLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "uint64",
- "name": "lastBatchSequenced",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingState",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingStateConsolidated",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatchBeforeUpgrade",
- "type": "uint64"
- },
+ "components": [
+ {
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingState",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingStateConsolidated",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturn",
+ "name": "rollupData",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
{
- "internalType": "uint64",
- "name": "rollupTypeID",
- "type": "uint64"
- },
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ }
+ ],
+ "name": "rollupIDToRollupDataV2",
+ "outputs": [
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
- "type": "uint8"
+ "components": [
+ {
+ "internalType": "address",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastPessimisticRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturnV2",
+ "name": "rollupData",
+ "type": "tuple"
}
],
"stateMutability": "view",
@@ -1700,7 +1605,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -1710,8 +1615,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -1723,6 +1628,11 @@
"internalType": "bytes32",
"name": "genesis",
"type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"stateMutability": "view",
@@ -1741,58 +1651,6 @@
"stateMutability": "nonpayable",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
- }
- ],
- "name": "setMultiplierBatchFee",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
- }
- ],
- "name": "setPendingStateTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
- "type": "uint64"
- }
- ],
- "name": "setTrustedAggregatorTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
- }
- ],
- "name": "setVerifyBatchTimeTarget",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [],
"name": "totalSequencedBatches",
@@ -1819,19 +1677,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "trustedAggregatorTimeout",
- "outputs": [
- {
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1856,16 +1701,21 @@
"type": "function"
},
{
- "inputs": [],
- "name": "verifyBatchTimeTarget",
- "outputs": [
+ "inputs": [
{
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
+ "internalType": "contract ITransparentUpgradeableProxy",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "newRollupTypeID",
+ "type": "uint32"
}
],
- "stateMutability": "view",
+ "name": "updateRollupByRollupAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -1911,7 +1761,7 @@
"type": "bytes32[24]"
}
],
- "name": "verifyBatches",
+ "name": "verifyBatchesTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1924,19 +1774,9 @@
"type": "uint32"
},
{
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
},
{
"internalType": "bytes32",
@@ -1945,28 +1785,23 @@
},
{
"internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "newPessimisticRoot",
"type": "bytes32"
},
{
- "internalType": "address",
- "name": "beneficiary",
- "type": "address"
- },
- {
- "internalType": "bytes32[24]",
+ "internalType": "bytes",
"name": "proof",
- "type": "bytes32[24]"
+ "type": "bytes"
}
],
- "name": "verifyBatchesTrustedAggregator",
+ "name": "verifyPessimisticTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
- "bytecode": "0x60e060405234801562000010575f80fd5b5060405162005fb638038062005fb6833981016040819052620000339162000136565b6001600160a01b0380841660805282811660c052811660a052620000566200005f565b50505062000187565b5f54610100900460ff1615620000cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200011c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000133575f80fd5b50565b5f805f6060848603121562000149575f80fd5b835162000156816200011e565b602085015190935062000169816200011e565b60408501519092506200017c816200011e565b809150509250925092565b60805160a05160c051615dcc620001ea5f395f8181610ac0015281816122b00152613bf201525f818161087b01528181612e8b0152613ef601525f8181610a1a015281816112fa015281816114be015281816120250152613deb0152615dcc5ff3fe608060405234801562000010575f80fd5b50600436106200038c575f3560e01c8063841b24d711620001e3578063c1acbc341162000113578063dbc1697611620000ab578063e46761c41162000083578063e46761c41462000aba578063f34eb8eb1462000ae2578063f4e926751462000af9578063f9c4c2ae1462000b0a575f80fd5b8063dbc169761462000a7e578063dde0ff771462000a88578063e0bfd3d21462000aa3575f80fd5b8063d02103ca11620000eb578063d02103ca1462000a14578063d5073f6f1462000a3c578063d547741f1462000a53578063d939b3151462000a6a575f80fd5b8063c1acbc3414620009ba578063c4c928c214620009d5578063ceee281d14620009ec575f80fd5b80639c9f3dfe1162000187578063a2967d99116200015f578063a2967d99146200086b578063a3c573eb1462000875578063afd23cbe14620008b6578063b99d0ad714620008e0575f80fd5b80639c9f3dfe1462000835578063a066215c146200084c578063a217fddf1462000863575f80fd5b806391d1485411620001bb57806391d1485414620007d957806399f5634e14620008145780639a908e73146200081e575f80fd5b8063841b24d7146200079057806387c20c0114620007ab5780638bd4f07114620007c2575f80fd5b80632528016911620002bf57806355a71ee011620002635780637222020f116200023b5780637222020f1462000714578063727885e9146200072b5780637975fcfe14620007425780637fb6e76a1462000768575f80fd5b806355a71ee0146200061957806360469169146200065c57806365c0504d1462000666575f80fd5b806336568abe116200029757806336568abe14620005e2578063394218e914620005f9578063477fa2701462000610575f80fd5b80632528016914620005035780632f2ff15d14620005b757806330c27dde14620005ce575f80fd5b80631489ed1011620003335780631796a1ae116200030b5780631796a1ae14620004875780631816b7e514620004ae5780632072f6c514620004c5578063248a9ca314620004cf575f80fd5b80631489ed10146200044b57806315064c9614620004625780631608859c1462000470575f80fd5b80630a0d9fbe11620003675780630a0d9fbe146200040257806311f6b287146200041d57806312b86e191462000434575f80fd5b80630645af091462000390578063066ec01214620003a9578063080b311114620003da575b5f80fd5b620003a7620003a13660046200490d565b62000c20565b005b608454620003bd906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003f1620003eb366004620049f6565b620011ed565b6040519015158152602001620003d1565b608554620003bd90600160401b90046001600160401b031681565b620003bd6200042e36600462004a2c565b62001216565b620003a76200044536600462004a5a565b62001235565b620003a76200045c36600462004aec565b620013f9565b606f54620003f19060ff1681565b620003a762000481366004620049f6565b620015a3565b607e54620004989063ffffffff1681565b60405163ffffffff9091168152602001620003d1565b620003a7620004bf36600462004b71565b6200164d565b620003a76200170a565b620004f4620004e036600462004b9b565b5f9081526034602052604090206001015490565b604051908152602001620003d1565b6200058362000514366004620049f6565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620003d1565b620003a7620005c836600462004bb3565b620017e6565b608754620003bd906001600160401b031681565b620003a7620005f336600462004bb3565b6200180e565b620003a76200060a36600462004be4565b62001848565b608654620004f4565b620004f46200062a366004620049f6565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004f46200190d565b620006ca6200067736600462004a2c565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620003d1565b620003a76200072536600462004a2c565b62001924565b620003a76200073c36600462004ca4565b62001a1e565b620007596200075336600462004d6a565b62001e7b565b604051620003d1919062004e1d565b620004986200077936600462004be4565b60836020525f908152604090205463ffffffff1681565b608454620003bd90600160c01b90046001600160401b031681565b620003a7620007bc36600462004aec565b62001ead565b620003a7620007d336600462004a5a565b620021d8565b620003f1620007ea36600462004bb3565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b620004f46200228f565b620003bd6200082f36600462004e31565b62002370565b620003a76200084636600462004be4565b6200253c565b620003a76200085d36600462004be4565b620025f3565b620004f45f81565b620004f4620026a9565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001620003d1565b608554620008cc90600160801b900461ffff1681565b60405161ffff9091168152602001620003d1565b62000975620008f1366004620049f6565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620003d191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b608454620003bd90600160801b90046001600160401b031681565b620003a7620009e636600462004e5c565b62002a71565b62000498620009fd36600462004eed565b60826020525f908152604090205463ffffffff1681565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000a4d36600462004b9b565b62002d6d565b620003a762000a6436600462004bb3565b62002e09565b608554620003bd906001600160401b031681565b620003a762002e31565b608454620003bd90600160401b90046001600160401b031681565b620003a762000ab436600462004f1c565b62002efd565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000af336600462004f94565b62002fd1565b608054620004989063ffffffff1681565b62000ba062000b1b36600462004a2c565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620003d1565b5f54600290610100900460ff1615801562000c4157505f5460ff8083169116105b62000cb95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161769070800000000000000001761ffff60801b19167103ea0000000000000000000000000000000017905562000d4c620031c5565b62000d787f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c62003231565b62000d845f8862003231565b62000db07fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003231565b62000ddc7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003231565b62000e087f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003231565b62000e347fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003231565b62000e607fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003231565b62000e8c7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003231565b62000eb87fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db18962003231565b62000f047f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f06200323d565b62000f307f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003231565b62000f5c7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003231565b62000fa87f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859516200323d565b62000fd47f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e8762003231565b620010007f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003231565b6073546074546001600160401b03600160401b909204821691168082146200103b57604051632e4cc54360e11b815260040160405180910390fd5b5f62001060888888885f60745f9054906101000a90046001600160401b031662003287565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200116694938316936b01000000000000000000000090049092169160769160779190600401620050cd565b5f604051808303815f87803b1580156200117e575f80fd5b505af115801562001191573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620011d89050565b60405180910390a15050505050505050505050565b63ffffffff82165f9081526081602052604081206200120d9083620034a8565b90505b92915050565b63ffffffff81165f9081526081602052604081206200121090620034ec565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462001261816200355b565b63ffffffff89165f90815260816020526040902062001287818a8a8a8a8a8a8a62003567565b60068101805467ffffffffffffffff60401b1916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012f8576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001331620026a9565b6040518263ffffffff1660e01b81526004016200135091815260200190565b5f604051808303815f87803b15801562001368575f80fd5b505af11580156200137b573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462001425816200355b565b63ffffffff89165f9081526081602052604090206200144b818a8a8a8a8a8a8a620038f5565b60068101805467ffffffffffffffff60401b1916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620014bc576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014f5620026a9565b6040518263ffffffff1660e01b81526004016200151491815260200190565b5f604051808303815f87803b1580156200152c575f80fd5b505af11580156200153f573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f9081526081602090815260408083203384527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a9092529091205460ff166200163c57606f5460ff16156200161257604051630bc011ff60e21b815260040160405180910390fd5b6200161e8183620034a8565b6200163c57604051630674f25160e11b815260040160405180910390fd5b62001648818362003d08565b505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001679816200355b565b6103e88261ffff1610806200169357506103ff8261ffff16115b15620016b257604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff16620017da57608454600160801b90046001600160401b031615806200178b57506084544290620017809062093a8090600160801b90046001600160401b031662005135565b6001600160401b0316115b80620017bb57506087544290620017b09062093a80906001600160401b031662005135565b6001600160401b0316115b15620017da5760405163692baaad60e11b815260040160405180910390fd5b620017e462003ef4565b565b5f8281526034602052604090206001015462001802816200355b565b62001648838362003f6e565b6001600160a01b03811633146200183857604051630b4ad1cd60e31b815260040160405180910390fd5b62001844828262003ff2565b5050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001874816200355b565b606f5460ff16620018b6576084546001600160401b03600160c01b909104811690831610620018b65760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620016fe565b5f60865460646200191f91906200515f565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001950816200355b565b63ffffffff821615806200196f5750607e5463ffffffff908116908316115b156200198e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620019d457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001a4a816200355b565b63ffffffff8816158062001a695750607e5463ffffffff908116908916115b1562001a8857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001ace57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001b0b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001b259063ffffffff1662005179565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001b7290620048d3565b62001b80939291906200519e565b604051809103905ff08015801562001b9a573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dfe949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e3e908d908d9088908e908e908e90600401620051d4565b5f604051808303815f87803b15801562001e56575f80fd5b505af115801562001e69573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001ea290878787878762004074565b979650505050505050565b606f5460ff161562001ed257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f2092600160c01b90048116911662005135565b6001600160401b0316111562001f4957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f58888862005236565b6001600160401b0316111562001f8157604051635acfba9d60e11b815260040160405180910390fd5b62001f938189898989898989620038f5565b62001f9f8187620041cb565b6085546001600160401b03165f03620020b05760068101805467ffffffffffffffff60401b1916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562002023576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200205c620026a9565b6040518263ffffffff1660e01b81526004016200207b91815260200190565b5f604051808303815f87803b15801562002093575f80fd5b505af1158015620020a6573d5f803e3d5ffd5b5050505062002179565b620020bb81620043c2565b600681018054600160801b90046001600160401b0316906010620020df8362005259565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620021fd57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062002223818989898989898962003567565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200228462003ef4565b505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620022f6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231c919062005277565b6084549091505f9062002342906001600160401b03600160401b82048116911662005236565b6001600160401b03169050805f036200235d575f9250505090565b620023698183620052a3565b9250505090565b606f545f9060ff16156200239757604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023ce576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023f857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242a9084906001600160401b031662005135565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200245f878362005135565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024ee83620043c2565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002568816200355b565b606f5460ff16620025a3576085546001600160401b0390811690831610620025a35760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620016fe565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db16200261f816200355b565b62015180826001600160401b031611156200264d57604051631c0cfbfd60e31b815260040160405180910390fd5b6085805467ffffffffffffffff60401b1916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620016fe565b6080545f9063ffffffff16808203620026c357505f919050565b5f816001600160401b03811115620026df57620026df62004c00565b60405190808252806020026020018201604052801562002709578160200160208202803683370190505b5090505f5b82811015620027795760815f62002727836001620052b9565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620027595762002759620052cf565b6020908102919091010152806200277081620052e3565b9150506200270e565b505f60205b83600114620029d1575f62002795600286620052fe565b620027a2600287620052a3565b620027ae9190620052b9565b90505f816001600160401b03811115620027cc57620027cc62004c00565b604051908082528060200260200182016040528015620027f6578160200160208202803683370190505b5090505f5b828110156200297d576200281160018462005314565b811480156200282c575062002828600288620052fe565b6001145b15620028b45785620028408260026200515f565b81518110620028535762002853620052cf565b60200260200101518560405160200162002877929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028a257620028a2620052cf565b60200260200101818152505062002968565b85620028c28260026200515f565b81518110620028d557620028d5620052cf565b602002602001015186826002620028ed91906200515f565b620028fa906001620052b9565b815181106200290d576200290d620052cf565b602002602001015160405160200162002930929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200295b576200295b620052cf565b6020026020010181815250505b806200297481620052e3565b915050620027fb565b508094508195508384604051602001620029a1929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029c6906200532a565b93505050506200277e565b5f835f81518110620029e757620029e7620052cf565b602002602001015190505f5b8281101562002a6757604080516020810184905290810185905260600160408051601f1981840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002a5e90620052e3565b915050620029f3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002a9d816200355b565b63ffffffff8416158062002abc5750607e5463ffffffff908116908516115b1562002adb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002b1b576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6957604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002baf57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bed57604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416027fffffffff00000000000000000000000000000000000000000000000000000000909216909217179055600782018054600160401b63ffffffff8a160267ffffffffffffffff60401b199091161790555f62002c928462001216565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002ce89216908b908b9060040162005342565b5f604051808303815f87803b15801562002d00575f80fd5b505af115801562002d13573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002d99816200355b565b683635c9adc5dea0000082118062002db45750633b9aca0082105b1562002dd357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fe565b5f8281526034602052604090206001015462002e25816200355b565b62001648838362003ff2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002e5d816200355b565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002ed9575f80fd5b505af115801562002eec573d5f803e3d5ffd5b5050505062002efa6200448b565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002f29816200355b565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002fa357604051630d409b9360e41b815260040160405180910390fd5b5f62002fb488888888875f62003287565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002ffd816200355b565b607e80545f91908290620030179063ffffffff1662005179565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031b39695949392919062005380565b60405180910390a25050505050505050565b5f54610100900460ff16620017e45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000cb0565b62001844828262003f6e565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620032a29063ffffffff1662005179565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034959594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034da92918116911662005135565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200353e575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002efa8133620044e3565b60078801545f906001600160401b0390811690871610156200359c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200363c5760068901546001600160401b03600160801b90910481169089161115620035e65760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200363557604051632bd2e3e760e01b815260040160405180910390fd5b50620036b0565b506001600160401b0385165f9081526002890160205260409020548062003676576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036b057604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036e95750876001600160401b0316876001600160401b031611155b806200370d575060068901546001600160401b03600160c01b909104811690881611155b156200372c5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003772576040516332a2a77f60e01b815260040160405180910390fd5b5f620037838a888888868962004074565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620037b99190620053d7565b602060405180830381855afa158015620037d5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190620037fa919062005277565b620038069190620052fe565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200384a91889190600401620053f4565b602060405180830381865afa15801562003866573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200388c919062005430565b620038aa576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038e85760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620039028a620034ec565b60078b01549091506001600160401b039081169089161015620039385760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039da5760068a01546001600160401b03600160801b9091048116908a161115620039825760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039d357604051632bd2e3e760e01b815260040160405180910390fd5b5062003a49565b6001600160401b0388165f90815260028b01602052604090205491508162003a15576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a4957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a7c5760405163b9b18f5760e01b815260040160405180910390fd5b5f62003a8d8b8a8a8a878b62004074565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003ac39190620053d7565b602060405180830381855afa15801562003adf573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003b04919062005277565b62003b109190620052fe565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5491899190600401620053f4565b602060405180830381865afa15801562003b70573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003b96919062005430565b62003bb4576040516309bde33960e01b815260040160405180910390fd5b5f62003bc1848b62005236565b905062003c1a87826001600160401b031662003bdc6200228f565b62003be891906200515f565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004526565b80608460088282829054906101000a90046001600160401b031662003c40919062005135565b82546101009290920a6001600160401b03818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003ce2575f80fd5b505af115801562003cf5573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d47575060068201546001600160401b03600160801b9091048116908216115b1562003d665760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f8181526004850160209081526040808320805460068901805467ffffffffffffffff60401b1916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e22620026a9565b6040518263ffffffff1660e01b815260040162003e4191815260200190565b5f604051808303815f87803b15801562003e59575f80fd5b505af115801562003e6c573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003f4d575f80fd5b505af115801562003f60573d5f803e3d5ffd5b50505050620017e46200458f565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662001844575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff161562001844575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f8181526003890160205260408082205493881682529020546060929115801590620040a9575081155b15620040c85760405163340c614f60e11b815260040160405180910390fd5b80620040e7576040516366385b5160e01b815260040160405180910390fd5b620040f284620045eb565b62004110576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f620041d783620034ec565b9050815f80620041e8848462005236565b6085546001600160401b0391821692505f916200420e91600160401b9004164262005314565b90505b846001600160401b0316846001600160401b03161462004297576001600160401b038085165f9081526003890160205260409020600181015490911682101562004272576001810154600160401b90046001600160401b0316945062004290565b6200427e868662005236565b6001600160401b031693505062004297565b5062004211565b5f620042a4848462005314565b9050838110156200430257808403600c8111620042c25780620042c5565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042f757620042f76200528f565b046086555062004379565b838103600c811162004315578062004318565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200435157620043516200528f565b04905080608654670de0b6b3a764000002816200437257620043726200528f565b0460865550505b683635c9adc5dea000006086541115620043a057683635c9adc5dea00000608655620043b8565b633b9aca006086541015620043b857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002efa5760068101545f906200440c90600160c01b90046001600160401b0316600162005135565b90506200441a8282620034a8565b15620018445760068201545f9060029062004447908490600160801b90046001600160401b031662005236565b62004453919062005451565b6200445f908362005135565b90506200446d8382620034a8565b156200447f5762001648838262003d08565b62001648838362003d08565b606f5460ff16620044af57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff166200184457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052620016489084906200466f565b606f5460ff1615620045b457604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004621575067ffffffff00000001604083901c6001600160401b0316105b801562004642575067ffffffff00000001608083901c6001600160401b0316105b80156200465a575067ffffffff0000000160c083901c105b156200466857506001919050565b505f919050565b5f620046c5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620047479092919063ffffffff16565b805190915015620016485780806020019051810190620046e6919062005430565b620016485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000cb0565b60606200475784845f856200475f565b949350505050565b606082471015620047c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000cb0565b5f80866001600160a01b03168587604051620047df9190620053d7565b5f6040518083038185875af1925050503d805f81146200481b576040519150601f19603f3d011682016040523d82523d5f602084013e62004820565b606091505b509150915062001ea28783838760608315620048a05782515f0362004898576001600160a01b0385163b620048985760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000cb0565b508162004757565b620047578383815115620048b75781518083602001fd5b8060405162461bcd60e51b815260040162000cb0919062004e1d565b61091d806200547a83390190565b6001600160a01b038116811462002efa575f80fd5b80356001600160401b038116811462003556575f80fd5b5f805f805f805f805f806101408b8d03121562004928575f80fd5b8a356200493581620048e1565b99506200494560208c01620048f6565b98506200495560408c01620048f6565b975060608b01356200496781620048e1565b965060808b01356200497981620048e1565b955060a08b01356200498b81620048e1565b945060c08b01356200499d81620048e1565b935060e08b0135620049af81620048e1565b9250620049c06101008c01620048f6565b9150620049d16101208c01620048f6565b90509295989b9194979a5092959850565b803563ffffffff8116811462003556575f80fd5b5f806040838503121562004a08575f80fd5b62004a1383620049e2565b915062004a2360208401620048f6565b90509250929050565b5f6020828403121562004a3d575f80fd5b6200120d82620049e2565b80610300810183101562001210575f80fd5b5f805f805f805f806103e0898b03121562004a73575f80fd5b62004a7e89620049e2565b975062004a8e60208a01620048f6565b965062004a9e60408a01620048f6565b955062004aae60608a01620048f6565b945062004abe60808a01620048f6565b935060a0890135925060c0890135915062004add8a60e08b0162004a48565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004b05575f80fd5b62004b1089620049e2565b975062004b2060208a01620048f6565b965062004b3060408a01620048f6565b955062004b4060608a01620048f6565b94506080890135935060a0890135925060c089013562004b6081620048e1565b915062004add8a60e08b0162004a48565b5f6020828403121562004b82575f80fd5b813561ffff8116811462004b94575f80fd5b9392505050565b5f6020828403121562004bac575f80fd5b5035919050565b5f806040838503121562004bc5575f80fd5b82359150602083013562004bd981620048e1565b809150509250929050565b5f6020828403121562004bf5575f80fd5b6200120d82620048f6565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004c24575f80fd5b81356001600160401b038082111562004c415762004c4162004c00565b604051601f8301601f19908116603f0116810190828211818310171562004c6c5762004c6c62004c00565b8160405283815286602085880101111562004c85575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004cbb575f80fd5b62004cc688620049e2565b965062004cd660208901620048f6565b9550604088013562004ce881620048e1565b9450606088013562004cfa81620048e1565b9350608088013562004d0c81620048e1565b925060a08801356001600160401b038082111562004d28575f80fd5b62004d368b838c0162004c14565b935060c08a013591508082111562004d4c575f80fd5b5062004d5b8a828b0162004c14565b91505092959891949750929550565b5f805f805f8060c0878903121562004d80575f80fd5b62004d8b87620049e2565b955062004d9b60208801620048f6565b945062004dab60408801620048f6565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004de857818101518382015260200162004dce565b50505f910152565b5f815180845262004e0981602086016020860162004dcc565b601f01601f19169290920160200192915050565b602081525f6200120d602083018462004df0565b5f806040838503121562004e43575f80fd5b62004e4e83620048f6565b946020939093013593505050565b5f805f806060858703121562004e70575f80fd5b843562004e7d81620048e1565b935062004e8d60208601620049e2565b925060408501356001600160401b038082111562004ea9575f80fd5b818701915087601f83011262004ebd575f80fd5b81358181111562004ecc575f80fd5b88602082850101111562004ede575f80fd5b95989497505060200194505050565b5f6020828403121562004efe575f80fd5b813562004b9481620048e1565b803560ff8116811462003556575f80fd5b5f805f805f8060c0878903121562004f32575f80fd5b863562004f3f81620048e1565b9550602087013562004f5181620048e1565b945062004f6160408801620048f6565b935062004f7160608801620048f6565b92506080870135915062004f8860a0880162004f0b565b90509295509295509295565b5f805f805f8060c0878903121562004faa575f80fd5b863562004fb781620048e1565b9550602087013562004fc981620048e1565b945062004fd960408801620048f6565b935062004fe96060880162004f0b565b92506080870135915060a08701356001600160401b038111156200500b575f80fd5b6200501989828a0162004c14565b9150509295509295509295565b80545f90600181811c90808316806200504057607f831692505b602080841082036200506057634e487b7160e01b5f52602260045260245ffd5b838852602088018280156200507e57600181146200509557620050c0565b60ff198716825285151560051b82019750620050c0565b5f898152602090205f5b87811015620050ba578154848201529086019084016200509f565b83019850505b5050505050505092915050565b5f6001600160a01b03808816835280871660208401525060a06040830152620050fa60a083018662005026565b82810360608401526200510e818662005026565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562005158576200515862005121565b5092915050565b808202811582820484141762001210576200121062005121565b5f63ffffffff80831681810362005194576200519462005121565b6001019392505050565b5f6001600160a01b03808616835280851660208401525060606040830152620051cb606083018462004df0565b95945050505050565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200521560c083018562004df0565b82810360a084015262005229818562004df0565b9998505050505050505050565b6001600160401b0382811682821603908082111562005158576200515862005121565b5f6001600160401b0380831681810362005194576200519462005121565b5f6020828403121562005288575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82620052b457620052b46200528f565b500490565b8082018082111562001210576200121062005121565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620052f757620052f762005121565b5060010190565b5f826200530f576200530f6200528f565b500690565b8181038181111562001210576200121062005121565b5f816200533b576200533b62005121565b505f190190565b6001600160a01b038416815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f6001600160a01b0380891683528088166020840152506001600160401b038616604083015260ff8516606083015283608083015260c060a0830152620053cb60c083018462004df0565b98975050505050505050565b5f8251620053ea81846020870162004dcc565b9190910192915050565b6103208101610300808584378201835f5b60018110156200542657815183526020928301929091019060010162005405565b5050509392505050565b5f6020828403121562005441575f80fd5b8151801515811462004b94575f80fd5b5f6001600160401b03808416806200546d576200546d6200528f565b9216919091049291505056fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212202ebb683450d7b4e6eb4bdbede3ecde1b348bfc9d8d354de2b24c7938858af51364736f6c63430008140033",
- "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200038c575f3560e01c8063841b24d711620001e3578063c1acbc341162000113578063dbc1697611620000ab578063e46761c41162000083578063e46761c41462000aba578063f34eb8eb1462000ae2578063f4e926751462000af9578063f9c4c2ae1462000b0a575f80fd5b8063dbc169761462000a7e578063dde0ff771462000a88578063e0bfd3d21462000aa3575f80fd5b8063d02103ca11620000eb578063d02103ca1462000a14578063d5073f6f1462000a3c578063d547741f1462000a53578063d939b3151462000a6a575f80fd5b8063c1acbc3414620009ba578063c4c928c214620009d5578063ceee281d14620009ec575f80fd5b80639c9f3dfe1162000187578063a2967d99116200015f578063a2967d99146200086b578063a3c573eb1462000875578063afd23cbe14620008b6578063b99d0ad714620008e0575f80fd5b80639c9f3dfe1462000835578063a066215c146200084c578063a217fddf1462000863575f80fd5b806391d1485411620001bb57806391d1485414620007d957806399f5634e14620008145780639a908e73146200081e575f80fd5b8063841b24d7146200079057806387c20c0114620007ab5780638bd4f07114620007c2575f80fd5b80632528016911620002bf57806355a71ee011620002635780637222020f116200023b5780637222020f1462000714578063727885e9146200072b5780637975fcfe14620007425780637fb6e76a1462000768575f80fd5b806355a71ee0146200061957806360469169146200065c57806365c0504d1462000666575f80fd5b806336568abe116200029757806336568abe14620005e2578063394218e914620005f9578063477fa2701462000610575f80fd5b80632528016914620005035780632f2ff15d14620005b757806330c27dde14620005ce575f80fd5b80631489ed1011620003335780631796a1ae116200030b5780631796a1ae14620004875780631816b7e514620004ae5780632072f6c514620004c5578063248a9ca314620004cf575f80fd5b80631489ed10146200044b57806315064c9614620004625780631608859c1462000470575f80fd5b80630a0d9fbe11620003675780630a0d9fbe146200040257806311f6b287146200041d57806312b86e191462000434575f80fd5b80630645af091462000390578063066ec01214620003a9578063080b311114620003da575b5f80fd5b620003a7620003a13660046200490d565b62000c20565b005b608454620003bd906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003f1620003eb366004620049f6565b620011ed565b6040519015158152602001620003d1565b608554620003bd90600160401b90046001600160401b031681565b620003bd6200042e36600462004a2c565b62001216565b620003a76200044536600462004a5a565b62001235565b620003a76200045c36600462004aec565b620013f9565b606f54620003f19060ff1681565b620003a762000481366004620049f6565b620015a3565b607e54620004989063ffffffff1681565b60405163ffffffff9091168152602001620003d1565b620003a7620004bf36600462004b71565b6200164d565b620003a76200170a565b620004f4620004e036600462004b9b565b5f9081526034602052604090206001015490565b604051908152602001620003d1565b6200058362000514366004620049f6565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620003d1565b620003a7620005c836600462004bb3565b620017e6565b608754620003bd906001600160401b031681565b620003a7620005f336600462004bb3565b6200180e565b620003a76200060a36600462004be4565b62001848565b608654620004f4565b620004f46200062a366004620049f6565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620004f46200190d565b620006ca6200067736600462004a2c565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620003d1565b620003a76200072536600462004a2c565b62001924565b620003a76200073c36600462004ca4565b62001a1e565b620007596200075336600462004d6a565b62001e7b565b604051620003d1919062004e1d565b620004986200077936600462004be4565b60836020525f908152604090205463ffffffff1681565b608454620003bd90600160c01b90046001600160401b031681565b620003a7620007bc36600462004aec565b62001ead565b620003a7620007d336600462004a5a565b620021d8565b620003f1620007ea36600462004bb3565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b620004f46200228f565b620003bd6200082f36600462004e31565b62002370565b620003a76200084636600462004be4565b6200253c565b620003a76200085d36600462004be4565b620025f3565b620004f45f81565b620004f4620026a9565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001620003d1565b608554620008cc90600160801b900461ffff1681565b60405161ffff9091168152602001620003d1565b62000975620008f1366004620049f6565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620003d191905f6080820190506001600160401b0380845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b608454620003bd90600160801b90046001600160401b031681565b620003a7620009e636600462004e5c565b62002a71565b62000498620009fd36600462004eed565b60826020525f908152604090205463ffffffff1681565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000a4d36600462004b9b565b62002d6d565b620003a762000a6436600462004bb3565b62002e09565b608554620003bd906001600160401b031681565b620003a762002e31565b608454620003bd90600160401b90046001600160401b031681565b620003a762000ab436600462004f1c565b62002efd565b6200089d7f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000af336600462004f94565b62002fd1565b608054620004989063ffffffff1681565b62000ba062000b1b36600462004a2c565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620003d1565b5f54600290610100900460ff1615801562000c4157505f5460ff8083169116105b62000cb95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161769070800000000000000001761ffff60801b19167103ea0000000000000000000000000000000017905562000d4c620031c5565b62000d787f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c62003231565b62000d845f8862003231565b62000db07fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003231565b62000ddc7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003231565b62000e087f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003231565b62000e347fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003231565b62000e607fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003231565b62000e8c7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003231565b62000eb87fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db18962003231565b62000f047f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f06200323d565b62000f307f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003231565b62000f5c7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003231565b62000fa87f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859516200323d565b62000fd47f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e8762003231565b620010007f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003231565b6073546074546001600160401b03600160401b909204821691168082146200103b57604051632e4cc54360e11b815260040160405180910390fd5b5f62001060888888885f60745f9054906101000a90046001600160401b031662003287565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a1667ffffffffffffffff198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a5946200116694938316936b01000000000000000000000090049092169160769160779190600401620050cd565b5f604051808303815f87803b1580156200117e575f80fd5b505af115801562001191573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249893506020019150620011d89050565b60405180910390a15050505050505050505050565b63ffffffff82165f9081526081602052604081206200120d9083620034a8565b90505b92915050565b63ffffffff81165f9081526081602052604081206200121090620034ec565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462001261816200355b565b63ffffffff89165f90815260816020526040902062001287818a8a8a8a8a8a8a62003567565b60068101805467ffffffffffffffff60401b1916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012f8576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001331620026a9565b6040518263ffffffff1660e01b81526004016200135091815260200190565b5f604051808303815f87803b15801562001368575f80fd5b505af11580156200137b573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462001425816200355b565b63ffffffff89165f9081526081602052604090206200144b818a8a8a8a8a8a8a620038f5565b60068101805467ffffffffffffffff60401b1916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b90041615620014bc576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014f5620026a9565b6040518263ffffffff1660e01b81526004016200151491815260200190565b5f604051808303815f87803b1580156200152c575f80fd5b505af11580156200153f573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f9081526081602090815260408083203384527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a9092529091205460ff166200163c57606f5460ff16156200161257604051630bc011ff60e21b815260040160405180910390fd5b6200161e8183620034a8565b6200163c57604051630674f25160e11b815260040160405180910390fd5b62001648818362003d08565b505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001679816200355b565b6103e88261ffff1610806200169357506103ff8261ffff16115b15620016b257604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff16620017da57608454600160801b90046001600160401b031615806200178b57506084544290620017809062093a8090600160801b90046001600160401b031662005135565b6001600160401b0316115b80620017bb57506087544290620017b09062093a80906001600160401b031662005135565b6001600160401b0316115b15620017da5760405163692baaad60e11b815260040160405180910390fd5b620017e462003ef4565b565b5f8281526034602052604090206001015462001802816200355b565b62001648838362003f6e565b6001600160a01b03811633146200183857604051630b4ad1cd60e31b815260040160405180910390fd5b62001844828262003ff2565b5050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001874816200355b565b606f5460ff16620018b6576084546001600160401b03600160c01b909104811690831610620018b65760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001620016fe565b5f60865460646200191f91906200515f565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001950816200355b565b63ffffffff821615806200196f5750607e5463ffffffff908116908316115b156200198e57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff1615159003620019d457604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001a4a816200355b565b63ffffffff8816158062001a695750607e5463ffffffff908116908916115b1562001a8857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001ace57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001b0b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001b259063ffffffff1662005179565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001b7290620048d3565b62001b80939291906200519e565b604051809103905ff08015801562001b9a573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001dfe949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001e3e908d908d9088908e908e908e90600401620051d4565b5f604051808303815f87803b15801562001e56575f80fd5b505af115801562001e69573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001ea290878787878762004074565b979650505050505050565b606f5460ff161562001ed257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001f2092600160c01b90048116911662005135565b6001600160401b0316111562001f4957604051638a0704d360e01b815260040160405180910390fd5b6103e862001f58888862005236565b6001600160401b0316111562001f8157604051635acfba9d60e11b815260040160405180910390fd5b62001f938189898989898989620038f5565b62001f9f8187620041cb565b6085546001600160401b03165f03620020b05760068101805467ffffffffffffffff60401b1916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562002023576006810180546fffffffffffffffffffffffffffffffff1690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6200205c620026a9565b6040518263ffffffff1660e01b81526004016200207b91815260200190565b5f604051808303815f87803b15801562002093575f80fd5b505af1158015620020a6573d5f803e3d5ffd5b5050505062002179565b620020bb81620043c2565b600681018054600160801b90046001600160401b0316906010620020df8362005259565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b604080516001600160401b038816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff1615620021fd57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062002223818989898989898962003567565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16200228462003ef4565b505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620022f6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231c919062005277565b6084549091505f9062002342906001600160401b03600160401b82048116911662005236565b6001600160401b03169050805f036200235d575f9250505090565b620023698183620052a3565b9250505090565b606f545f9060ff16156200239757604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023ce576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023f857604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242a9084906001600160401b031662005135565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200245f878362005135565b6006840180546001600160401b0380841667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024ee83620043c2565b6040516001600160401b038216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002568816200355b565b606f5460ff16620025a3576085546001600160401b0390811690831610620025a35760405163048a05a960e41b815260040160405180910390fd5b6085805467ffffffffffffffff19166001600160401b0384169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001620016fe565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db16200261f816200355b565b62015180826001600160401b031611156200264d57604051631c0cfbfd60e31b815260040160405180910390fd5b6085805467ffffffffffffffff60401b1916600160401b6001600160401b038516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001620016fe565b6080545f9063ffffffff16808203620026c357505f919050565b5f816001600160401b03811115620026df57620026df62004c00565b60405190808252806020026020018201604052801562002709578160200160208202803683370190505b5090505f5b82811015620027795760815f62002727836001620052b9565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620027595762002759620052cf565b6020908102919091010152806200277081620052e3565b9150506200270e565b505f60205b83600114620029d1575f62002795600286620052fe565b620027a2600287620052a3565b620027ae9190620052b9565b90505f816001600160401b03811115620027cc57620027cc62004c00565b604051908082528060200260200182016040528015620027f6578160200160208202803683370190505b5090505f5b828110156200297d576200281160018462005314565b811480156200282c575062002828600288620052fe565b6001145b15620028b45785620028408260026200515f565b81518110620028535762002853620052cf565b60200260200101518560405160200162002877929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028a257620028a2620052cf565b60200260200101818152505062002968565b85620028c28260026200515f565b81518110620028d557620028d5620052cf565b602002602001015186826002620028ed91906200515f565b620028fa906001620052b9565b815181106200290d576200290d620052cf565b602002602001015160405160200162002930929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200295b576200295b620052cf565b6020026020010181815250505b806200297481620052e3565b915050620027fb565b508094508195508384604051602001620029a1929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029c6906200532a565b93505050506200277e565b5f835f81518110620029e757620029e7620052cf565b602002602001015190505f5b8281101562002a6757604080516020810184905290810185905260600160408051601f1981840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002a5e90620052e3565b915050620029f3565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002a9d816200355b565b63ffffffff8416158062002abc5750607e5463ffffffff908116908516115b1562002adb57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002b1b576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b6957604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002baf57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002bed57604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416027fffffffff00000000000000000000000000000000000000000000000000000000909216909217179055600782018054600160401b63ffffffff8a160267ffffffffffffffff60401b199091161790555f62002c928462001216565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002ce89216908b908b9060040162005342565b5f604051808303815f87803b15801562002d00575f80fd5b505af115801562002d13573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002d99816200355b565b683635c9adc5dea0000082118062002db45750633b9aca0082105b1562002dd357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016fe565b5f8281526034602052604090206001015462002e25816200355b565b62001648838362003ff2565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002e5d816200355b565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002ed9575f80fd5b505af115801562002eec573d5f803e3d5ffd5b5050505062002efa6200448b565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62002f29816200355b565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002f66576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002fa357604051630d409b9360e41b815260040160405180910390fd5b5f62002fb488888888875f62003287565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002ffd816200355b565b607e80545f91908290620030179063ffffffff1662005179565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620031b39695949392919062005380565b60405180910390a25050505050505050565b5f54610100900460ff16620017e45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000cb0565b62001844828262003f6e565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620032a29063ffffffff1662005179565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620034959594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034da92918116911662005135565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200353e575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002efa8133620044e3565b60078801545f906001600160401b0390811690871610156200359c5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200363c5760068901546001600160401b03600160801b90910481169089161115620035e65760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200363557604051632bd2e3e760e01b815260040160405180910390fd5b50620036b0565b506001600160401b0385165f9081526002890160205260409020548062003676576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620036b057604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036e95750876001600160401b0316876001600160401b031611155b806200370d575060068901546001600160401b03600160c01b909104811690881611155b156200372c5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b900481169086161462003772576040516332a2a77f60e01b815260040160405180910390fd5b5f620037838a888888868962004074565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620037b99190620053d7565b602060405180830381855afa158015620037d5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190620037fa919062005277565b620038069190620052fe565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a916200384a91889190600401620053f4565b602060405180830381865afa15801562003866573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200388c919062005430565b620038aa576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038e85760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f80620039028a620034ec565b60078b01549091506001600160401b039081169089161015620039385760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039da5760068a01546001600160401b03600160801b9091048116908a161115620039825760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b9092041614620039d357604051632bd2e3e760e01b815260040160405180910390fd5b5062003a49565b6001600160401b0388165f90815260028b01602052604090205491508162003a15576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562003a4957604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162003a7c5760405163b9b18f5760e01b815260040160405180910390fd5b5f62003a8d8b8a8a8a878b62004074565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003ac39190620053d7565b602060405180830381855afa15801562003adf573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003b04919062005277565b62003b109190620052fe565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003b5491899190600401620053f4565b602060405180830381865afa15801562003b70573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003b96919062005430565b62003bb4576040516309bde33960e01b815260040160405180910390fd5b5f62003bc1848b62005236565b905062003c1a87826001600160401b031662003bdc6200228f565b62003be891906200515f565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062004526565b80608460088282829054906101000a90046001600160401b031662003c40919062005135565b82546101009290920a6001600160401b03818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003ce2575f80fd5b505af115801562003cf5573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003d47575060068201546001600160401b03600160801b9091048116908216115b1562003d665760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f8181526004850160209081526040808320805460068901805467ffffffffffffffff60401b1916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003e22620026a9565b6040518263ffffffff1660e01b815260040162003e4191815260200190565b5f604051808303815f87803b15801562003e59575f80fd5b505af115801562003e6c573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003f4d575f80fd5b505af115801562003f60573d5f803e3d5ffd5b50505050620017e46200458f565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662001844575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff161562001844575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f8181526003890160205260408082205493881682529020546060929115801590620040a9575081155b15620040c85760405163340c614f60e11b815260040160405180910390fd5b80620040e7576040516366385b5160e01b815260040160405180910390fd5b620040f284620045eb565b62004110576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f620041d783620034ec565b9050815f80620041e8848462005236565b6085546001600160401b0391821692505f916200420e91600160401b9004164262005314565b90505b846001600160401b0316846001600160401b03161462004297576001600160401b038085165f9081526003890160205260409020600181015490911682101562004272576001810154600160401b90046001600160401b0316945062004290565b6200427e868662005236565b6001600160401b031693505062004297565b5062004211565b5f620042a4848462005314565b9050838110156200430257808403600c8111620042c25780620042c5565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620042f757620042f76200528f565b046086555062004379565b838103600c811162004315578062004318565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a764000002816200435157620043516200528f565b04905080608654670de0b6b3a764000002816200437257620043726200528f565b0460865550505b683635c9adc5dea000006086541115620043a057683635c9adc5dea00000608655620043b8565b633b9aca006086541015620043b857633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002efa5760068101545f906200440c90600160c01b90046001600160401b0316600162005135565b90506200441a8282620034a8565b15620018445760068201545f9060029062004447908490600160801b90046001600160401b031662005236565b62004453919062005451565b6200445f908362005135565b90506200446d8382620034a8565b156200447f5762001648838262003d08565b62001648838362003d08565b606f5460ff16620044af57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff166200184457604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052620016489084906200466f565b606f5460ff1615620045b457604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b03831610801562004621575067ffffffff00000001604083901c6001600160401b0316105b801562004642575067ffffffff00000001608083901c6001600160401b0316105b80156200465a575067ffffffff0000000160c083901c105b156200466857506001919050565b505f919050565b5f620046c5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620047479092919063ffffffff16565b805190915015620016485780806020019051810190620046e6919062005430565b620016485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000cb0565b60606200475784845f856200475f565b949350505050565b606082471015620047c25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000cb0565b5f80866001600160a01b03168587604051620047df9190620053d7565b5f6040518083038185875af1925050503d805f81146200481b576040519150601f19603f3d011682016040523d82523d5f602084013e62004820565b606091505b509150915062001ea28783838760608315620048a05782515f0362004898576001600160a01b0385163b620048985760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000cb0565b508162004757565b620047578383815115620048b75781518083602001fd5b8060405162461bcd60e51b815260040162000cb0919062004e1d565b61091d806200547a83390190565b6001600160a01b038116811462002efa575f80fd5b80356001600160401b038116811462003556575f80fd5b5f805f805f805f805f806101408b8d03121562004928575f80fd5b8a356200493581620048e1565b99506200494560208c01620048f6565b98506200495560408c01620048f6565b975060608b01356200496781620048e1565b965060808b01356200497981620048e1565b955060a08b01356200498b81620048e1565b945060c08b01356200499d81620048e1565b935060e08b0135620049af81620048e1565b9250620049c06101008c01620048f6565b9150620049d16101208c01620048f6565b90509295989b9194979a5092959850565b803563ffffffff8116811462003556575f80fd5b5f806040838503121562004a08575f80fd5b62004a1383620049e2565b915062004a2360208401620048f6565b90509250929050565b5f6020828403121562004a3d575f80fd5b6200120d82620049e2565b80610300810183101562001210575f80fd5b5f805f805f805f806103e0898b03121562004a73575f80fd5b62004a7e89620049e2565b975062004a8e60208a01620048f6565b965062004a9e60408a01620048f6565b955062004aae60608a01620048f6565b945062004abe60808a01620048f6565b935060a0890135925060c0890135915062004add8a60e08b0162004a48565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004b05575f80fd5b62004b1089620049e2565b975062004b2060208a01620048f6565b965062004b3060408a01620048f6565b955062004b4060608a01620048f6565b94506080890135935060a0890135925060c089013562004b6081620048e1565b915062004add8a60e08b0162004a48565b5f6020828403121562004b82575f80fd5b813561ffff8116811462004b94575f80fd5b9392505050565b5f6020828403121562004bac575f80fd5b5035919050565b5f806040838503121562004bc5575f80fd5b82359150602083013562004bd981620048e1565b809150509250929050565b5f6020828403121562004bf5575f80fd5b6200120d82620048f6565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262004c24575f80fd5b81356001600160401b038082111562004c415762004c4162004c00565b604051601f8301601f19908116603f0116810190828211818310171562004c6c5762004c6c62004c00565b8160405283815286602085880101111562004c85575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562004cbb575f80fd5b62004cc688620049e2565b965062004cd660208901620048f6565b9550604088013562004ce881620048e1565b9450606088013562004cfa81620048e1565b9350608088013562004d0c81620048e1565b925060a08801356001600160401b038082111562004d28575f80fd5b62004d368b838c0162004c14565b935060c08a013591508082111562004d4c575f80fd5b5062004d5b8a828b0162004c14565b91505092959891949750929550565b5f805f805f8060c0878903121562004d80575f80fd5b62004d8b87620049e2565b955062004d9b60208801620048f6565b945062004dab60408801620048f6565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004de857818101518382015260200162004dce565b50505f910152565b5f815180845262004e0981602086016020860162004dcc565b601f01601f19169290920160200192915050565b602081525f6200120d602083018462004df0565b5f806040838503121562004e43575f80fd5b62004e4e83620048f6565b946020939093013593505050565b5f805f806060858703121562004e70575f80fd5b843562004e7d81620048e1565b935062004e8d60208601620049e2565b925060408501356001600160401b038082111562004ea9575f80fd5b818701915087601f83011262004ebd575f80fd5b81358181111562004ecc575f80fd5b88602082850101111562004ede575f80fd5b95989497505060200194505050565b5f6020828403121562004efe575f80fd5b813562004b9481620048e1565b803560ff8116811462003556575f80fd5b5f805f805f8060c0878903121562004f32575f80fd5b863562004f3f81620048e1565b9550602087013562004f5181620048e1565b945062004f6160408801620048f6565b935062004f7160608801620048f6565b92506080870135915062004f8860a0880162004f0b565b90509295509295509295565b5f805f805f8060c0878903121562004faa575f80fd5b863562004fb781620048e1565b9550602087013562004fc981620048e1565b945062004fd960408801620048f6565b935062004fe96060880162004f0b565b92506080870135915060a08701356001600160401b038111156200500b575f80fd5b6200501989828a0162004c14565b9150509295509295509295565b80545f90600181811c90808316806200504057607f831692505b602080841082036200506057634e487b7160e01b5f52602260045260245ffd5b838852602088018280156200507e57600181146200509557620050c0565b60ff198716825285151560051b82019750620050c0565b5f898152602090205f5b87811015620050ba578154848201529086019084016200509f565b83019850505b5050505050505092915050565b5f6001600160a01b03808816835280871660208401525060a06040830152620050fa60a083018662005026565b82810360608401526200510e818662005026565b9150508260808301529695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562005158576200515862005121565b5092915050565b808202811582820484141762001210576200121062005121565b5f63ffffffff80831681810362005194576200519462005121565b6001019392505050565b5f6001600160a01b03808616835280851660208401525060606040830152620051cb606083018462004df0565b95945050505050565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200521560c083018562004df0565b82810360a084015262005229818562004df0565b9998505050505050505050565b6001600160401b0382811682821603908082111562005158576200515862005121565b5f6001600160401b0380831681810362005194576200519462005121565b5f6020828403121562005288575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82620052b457620052b46200528f565b500490565b8082018082111562001210576200121062005121565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620052f757620052f762005121565b5060010190565b5f826200530f576200530f6200528f565b500690565b8181038181111562001210576200121062005121565b5f816200533b576200533b62005121565b505f190190565b6001600160a01b038416815260406020820152816040820152818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f6001600160a01b0380891683528088166020840152506001600160401b038616604083015260ff8516606083015283608083015260c060a0830152620053cb60c083018462004df0565b98975050505050505050565b5f8251620053ea81846020870162004dcc565b9190910192915050565b6103208101610300808584378201835f5b60018110156200542657815183526020928301929091019060010162005405565b5050509392505050565b5f6020828403121562005441575f80fd5b8151801515811462004b94575f80fd5b5f6001600160401b03808416806200546d576200546d6200528f565b9216919091049291505056fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212202ebb683450d7b4e6eb4bdbede3ecde1b348bfc9d8d354de2b24c7938858af51364736f6c63430008140033",
+ "bytecode": "0x60e060405234801562000010575f80fd5b506040516200523038038062005230833981016040819052620000339162000136565b6001600160a01b0380841660805282811660c052811660a052620000566200005f565b50505062000187565b5f54610100900460ff1615620000cb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200011c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000133575f80fd5b50565b5f805f6060848603121562000149575f80fd5b835162000156816200011e565b602085015190935062000169816200011e565b60408501519092506200017c816200011e565b809150509250925092565b60805160a05160c05161504d620001e35f395f818161089c01528181611e260152612e5a01525f818161072d015281816128bf0152612f2601525f81816107df01528181610a2e0152818161153e0152611686015261504d5ff3fe608060405234801562000010575f80fd5b5060043610620002fc575f3560e01c80638fd88cc211620001a3578063c4c928c211620000fb578063dbc16976116200009f578063e46761c41162000077578063e46761c41462000896578063f4e9267514620008be578063f9c4c2ae14620008cf575f80fd5b8063dbc16976146200085a578063dde0ff771462000864578063dfdb8c5e146200087f575f80fd5b8063d5073f6f11620000d3578063d5073f6f1462000801578063d547741f1462000818578063d8905812146200082f575f80fd5b8063c4c928c2146200079a578063ceee281d14620007b1578063d02103ca14620007d9575f80fd5b80639e36c5651162000163578063a3c573eb116200013b578063a3c573eb1462000727578063abcb51981462000768578063c1acbc34146200077f575f80fd5b80639e36c56514620006fe578063a217fddf1462000715578063a2967d99146200071d575f80fd5b80638fd88cc2146200067457806391d14854146200068b57806397bf07e814620006c657806399f5634e14620006dd5780639a908e7314620006e7575f80fd5b8063477fa2701162000257578063727885e911620002175780637fb6e76a11620001ef5780637fb6e76a146200062b5780638129fc1c14620006535780638875f03c146200065d575f80fd5b8063727885e914620005c857806374d9c24414620005df5780637975fcfe1462000605575f80fd5b8063477fa27014620004db57806355a71ee014620004e457806360469169146200052757806365c0504d14620005315780637222020f14620005b1575f80fd5b80632072f6c511620002bf5780632f2ff15d11620002975780632f2ff15d146200049957806330c27dde14620004b057806336568abe14620004c4575f80fd5b80632072f6c514620003a7578063248a9ca314620003b15780632528016914620003e5575f80fd5b8063066ec012146200030057806311f6b28714620003315780631489ed10146200034857806315064c9614620003615780631796a1ae1462000380575b5f80fd5b60845462000314906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200031462000342366004620039c5565b620008f5565b6200035f6200035936600462003a14565b62000924565b005b606f546200036f9060ff1681565b604051901515815260200162000328565b607e54620003919063ffffffff1681565b60405163ffffffff909116815260200162000328565b6200035f62000b14565b620003d6620003c236600462003aae565b5f9081526034602052604090206001015490565b60405190815260200162000328565b62000465620003f636600462003ac6565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000328565b6200035f620004aa36600462003afc565b62000bf0565b60875462000314906001600160401b031681565b6200035f620004d536600462003afc565b62000c1d565b608654620003d6565b620003d6620004f536600462003ac6565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d662000c57565b6200059c62000542366004620039c5565b607f6020525f908152604090208054600182015460028301546003909301546001600160a01b0392831693928216926001600160401b03600160a01b8404169260ff600160e01b8204811693600160e81b90920416919087565b60405162000328979695949392919062003b62565b6200035f620005c2366004620039c5565b62000c6e565b6200035f620005d936600462003c64565b62000d64565b620005f6620005f0366004620039c5565b620011f2565b60405162000328919062003d2a565b6200061c6200061636600462003e36565b62001324565b60405162000328919062003ee9565b620003916200063c36600462003efd565b60836020525f908152604090205463ffffffff1681565b6200035f62001356565b6200035f6200066e36600462003f19565b6200149d565b6200035f6200068536600462003fbf565b62001753565b6200036f6200069c36600462003afc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6200035f620006d736600462003fed565b62001aed565b620003d662001e05565b62000314620006f83660046200406f565b62001ee6565b6200061c6200070f3660046200409a565b620020e7565b620003d65f81565b620003d662002119565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000328565b6200035f62000779366004620040d3565b620024e1565b6084546200031490600160801b90046001600160401b031681565b6200035f620007ab3660046200416f565b6200275c565b62000391620007c2366004620041e6565b60826020525f908152604090205463ffffffff1681565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b6200035f6200081236600462003aae565b6200279b565b6200035f6200082936600462003afc565b6200283d565b6200061c6040518060400160405280600b81526020016a70657373696d697374696360a81b81525081565b6200035f62002865565b6084546200031490600160401b90046001600160401b031681565b6200035f6200089036600462004204565b62002931565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b608054620003919063ffffffff1681565b620008e6620008e0366004620039c5565b62002a81565b60405162000328919062004233565b63ffffffff81165f90815260816020526040812060060154600160401b90046001600160401b03165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620009508162002be1565b6001600160401b03881615620009795760405163306dfc5760e11b815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154600160801b900460ff166001811115620009b157620009b162003b2d565b14620009d0576040516390db0d0760e01b815260040160405180910390fd5b620009e18189898989898962002bed565b6006810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038a16908102919091179091555f9081526002820160205260409020859055600581018690557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000a6562002119565b6040518263ffffffff1660e01b815260040162000a8491815260200190565b5f604051808303815f87803b15801562000a9c575f80fd5b505af115801562000aaf573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff1662000be457608454600160801b90046001600160401b0316158062000b955750608454429062000b8a9062093a8090600160801b90046001600160401b03166200435c565b6001600160401b0316115b8062000bc55750608754429062000bba9062093a80906001600160401b03166200435c565b6001600160401b0316115b1562000be45760405163692baaad60e11b815260040160405180910390fd5b62000bee62002f24565b565b5f8281526034602052604090206001015462000c0c8162002be1565b62000c18838362002f9e565b505050565b6001600160a01b038116331462000c4757604051630b4ad1cd60e31b815260040160405180910390fd5b62000c53828262003022565b5050565b5f608654606462000c69919062004386565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62000c9a8162002be1565b63ffffffff8216158062000cb95750607e5463ffffffff908116908316115b1562000cd857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001810154600160e81b900460ff161562000d1a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862000d908162002be1565b63ffffffff8816158062000daf5750607e5463ffffffff908116908916115b1562000dce57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001810154600160e81b900460ff161562000e1057604051633b8d3d9960e01b815260040160405180910390fd5b63ffffffff6001600160401b038916111562000e3f57604051634c753f5760e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562000e7c576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062000e969063ffffffff16620043a0565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162000ee390620039a3565b62000ef193929190620043c5565b604051809103905ff08015801562000f0b573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360018111156200110b576200110b62003b2d565b0217905550600384015460098201556040805163ffffffff8e811682526001600160a01b0385811660208401526001600160401b038f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a2604051633892b81160e11b81526001600160a01b03831690637125702290620011b5908d908d9088908e908e908e90600401620043f2565b5f604051808303815f87803b158015620011cd575f80fd5b505af1158015620011e0573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a90982080546001600160a01b038082168c52600160a01b918290046001600160401b0390811690995260018084015491821690985204871690945260058401549092526006830154808616909152600160401b9081900485169091526007820154808516909652850490921690955292939091600160801b900460ff1690811115620012f157620012f162003b2d565b9081600181111562001307576200130762003b2d565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f9081526081602052604090206060906200134b908787878787620030a4565b979650505050505050565b5f54600390610100900460ff161580156200137757505f5460ff8083169116105b620013ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461ffff191660ff831617610100179055604080518082018252600b81526a70657373696d697374696360a81b602082015290517f50cadc0c001f05dd4b81db1e92b98d77e718fd2f103fb7b77293e867d329a4c291620014529162003ee9565b60405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620014c98162002be1565b63ffffffff87165f90815260816020526040902060016007820154600160801b900460ff16600181111562001502576200150262003b2d565b146200152157604051633a64d97360e01b815260040160405180910390fd5b60405163ef4eeb3560e01b815263ffffffff881660048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ef4eeb3590602401602060405180830381865afa1580156200158c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620015b2919062004454565b905080620015d35760405163a60721e160e01b815260040160405180910390fd5b5f620015e38a84848b8b620031fb565b6001840154600985015460405163020a49e360e51b81529293506001600160a01b03909116916341493c6091620016239185908b908b906004016200446c565b5f6040518083038186803b1580156200163a575f80fd5b505afa1580156200164d573d5f803e3d5ffd5b50506084805467ffffffffffffffff60801b1916600160801b426001600160401b031602179055505060058301889055600883018790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620016bd62002119565b6040518263ffffffff1660e01b8152600401620016dc91815260200190565b5f604051808303815f87803b158015620016f4575f80fd5b505af115801562001707573d5f803e3d5ffd5b5050604080515f80825260208201529081018b905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600162000b00565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff16158015620018065750336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015620017d4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017fa9190620044b9565b6001600160a01b031614155b156200182557604051630d03687f60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526082602052604081205463ffffffff169081900362001865576040516374a086a360e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff1660018111156200189d576200189d62003b2d565b14620018bc576040516390db0d0760e01b815260040160405180910390fd5b60068101546001600160401b0390811690841681111580620018f5575060068201546001600160401b03600160401b9091048116908516105b15620019145760405163cb23ebdf60e01b815260040160405180910390fd5b805b846001600160401b0316816001600160401b031614620019b8576001600160401b038082165f908152600385016020526040902060010154600160401b900481169086168110156200197b57604051639753965f60e01b815260040160405180910390fd5b6001600160401b039091165f908152600384016020526040812090815560010180546fffffffffffffffffffffffffffffffff1916905562001916565b60068301805467ffffffffffffffff19166001600160401b038716179055620019e28583620044d7565b608480545f90620019fe9084906001600160401b0316620044d7565b82546101009290920a6001600160401b0381810219909316918316021790915586165f8181526003860160205260409081902054905163334d6f6760e11b8152600481019290925260248201526001600160a01b038816915063669adece906044015f604051808303815f87803b15801562001a78575f80fd5b505af115801562001a8b573d5f803e3d5ffd5b505050506001600160401b0385165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62001b198162002be1565b6001600160401b0385165f9081526083602052604090205463ffffffff161562001b56576040516337c8fe0960e11b815260040160405180910390fd5b63ffffffff6001600160401b038616111562001b8557604051634c753f5760e01b815260040160405180910390fd5b6001600160a01b0388165f9081526082602052604090205463ffffffff161562001bc257604051630d409b9360e41b815260040160405180910390fd5b608080545f9190829062001bdc9063ffffffff16620043a0565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f886001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550878160010160146101000a8154816001600160401b0302191690836001600160401b0316021790555088816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555086815f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550848160070160106101000a81548160ff0219169083600181111562001d665762001d6662003b2d565b0217905550600185600181111562001d825762001d8262003b2d565b0362001d9c57600981018490556005810186905562001daf565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a60405162001df196959493929190620044fa565b60405180910390a250505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001e6c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001e92919062004454565b6084549091505f9062001eb8906001600160401b03600160401b820481169116620044d7565b6001600160401b03169050805f0362001ed3575f9250505090565b62001edf81836200455b565b9250505090565b606f545f9060ff161562001f0d57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001f44576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001f6e57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff16600181111562001fa65762001fa662003b2d565b1462001fc5576040516390db0d0760e01b815260040160405180910390fd5b608480548691905f9062001fe49084906001600160401b03166200435c565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200201987836200435c565b6006840180546001600160401b0383811667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c018352859020935184559151600193909301805492518716600160401b026fffffffffffffffffffffffffffffffff199093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200210e908690868686620031fb565b90505b949350505050565b6080545f9063ffffffff168082036200213357505f919050565b5f816001600160401b038111156200214f576200214f62003bb6565b60405190808252806020026020018201604052801562002179578160200160208202803683370190505b5090505f5b82811015620021e95760815f6200219783600162004571565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620021c957620021c962004587565b602090810291909101015280620021e0816200459b565b9150506200217e565b505f60205b8360011462002441575f62002205600286620045b6565b620022126002876200455b565b6200221e919062004571565b90505f816001600160401b038111156200223c576200223c62003bb6565b60405190808252806020026020018201604052801562002266578160200160208202803683370190505b5090505f5b82811015620023ed5762002281600184620045cc565b811480156200229c575062002298600288620045b6565b6001145b15620023245785620022b082600262004386565b81518110620022c357620022c362004587565b602002602001015185604051602001620022e7929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002312576200231262004587565b602002602001018181525050620023d8565b856200233282600262004386565b8151811062002345576200234562004587565b6020026020010151868260026200235d919062004386565b6200236a90600162004571565b815181106200237d576200237d62004587565b6020026020010151604051602001620023a0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620023cb57620023cb62004587565b6020026020010181815250505b80620023e4816200459b565b9150506200226b565b50809450819550838460405160200162002411929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200243690620045e2565b9350505050620021ee565b5f835f8151811062002457576200245762004587565b602002602001015190505f5b82811015620024d757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024ce906200459b565b91505062002463565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5906200250d8162002be1565b607e80545f91908290620025279063ffffffff16620043a0565b91906101000a81548163ffffffff021916908363ffffffff160217905590506001808111156200255b576200255b62003b2d565b86600181111562002570576200257062003b2d565b036200259c57841562002596576040516363d722e760e01b815260040160405180910390fd5b620025bc565b8215620025bc576040516363d722e760e01b815260040160405180910390fd5b6040518060e001604052808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b0316815260200187600181111562002609576200260962003b2d565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f825291829020845181546001600160a01b0391821673ffffffffffffffffffffffffffffffffffffffff199091161782559185015160018281018054958801516001600160401b0316600160a01b026001600160e01b0319909616929094169190911793909317808355938501519093909260ff60e01b1990911690600160e01b908490811115620026c557620026c562003b2d565b02179055506080820151600182018054911515600160e81b0260ff60e81b1990921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002749908c908c908c908c908c908c908c90620045fa565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620027888162002be1565b62002795848484620032e0565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620027c78162002be1565b683635c9adc5dea00000821180620027e25750633b9aca0082105b156200280157604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f82815260346020526040902060010154620028598162002be1565b62000c18838362003022565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620028918162002be1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b1580156200290d575f80fd5b505af115801562002920573d5f803e3d5ffd5b505050506200292e620035c6565b50565b336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002978573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200299e9190620044b9565b6001600160a01b031614620029c65760405163696072e960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526082602090815260408083205463ffffffff1683526081909152902060068101546001600160401b03808216600160401b909204161462002a285760405163664316a560e11b815260040160405180910390fd5b600781015463ffffffff8316600160401b9091046001600160401b03161062002a6457604051633e37e23360e01b815260040160405180910390fd5b604080515f81526020810190915262000c189084908490620032e0565b62002ae660408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f9081526081602090815260409182902080546001600160a01b038082168652600160a01b918290046001600160401b039081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a0860152600160401b808204841660c0870152600160801b808304851660e0880152600160c01b9092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff169081111562002bc15762002bc162003b2d565b9081600181111562002bd75762002bd762003b2d565b8152505050919050565b6200292e81336200361e565b5f8062002c0c89600601546001600160401b03600160401b9091041690565b60078a01549091506001600160401b03908116908916101562002c425760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388165f90815260028a01602052604090205491508162002c7d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562002cb157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162002ce45760405163b9b18f5760e01b815260040160405180910390fd5b5f62002cf58a8a8a8a878b620030a4565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162002d2b91906200465d565b602060405180830381855afa15801562002d47573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062002d6c919062004454565b62002d789190620045b6565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162002dbc918991906004016200467a565b602060405180830381865afa15801562002dd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002dfe9190620046b6565b62002e1c576040516309bde33960e01b815260040160405180910390fd5b5f62002e29848b620044d7565b905062002e8287826001600160401b031662002e4462001e05565b62002e50919062004386565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003661565b80608460088282829054906101000a90046001600160401b031662002ea891906200435c565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558d546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401620011b5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562002f7d575f80fd5b505af115801562002f90573d5f803e3d5ffd5b5050505062000bee620036ca565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662000c53575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff161562000c53575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f8181526003890160205260408082205493881682529020546060929115801590620030d9575081155b15620030f85760405163340c614f60e11b815260040160405180910390fd5b8062003117576040516366385b5160e01b815260040160405180910390fd5b620031228462003726565b62003140576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a90046001600160a01b03166001600160a01b031663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003250573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003276919062004454565b60058701546008880154604080516020810193909352820152606081018790526001600160e01b031960e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff82161580620032ff5750607e5463ffffffff908116908316115b156200331e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526082602052604081205463ffffffff16908190036200335e576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918516600160401b9091046001600160401b031603620033ac57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001810154600160e81b900460ff1615620033ee57604051633b8d3d9960e01b815260040160405180910390fd5b600181810154600160e01b900460ff169081111562003411576200341162003b2d565b6007830154600160801b900460ff16600181111562003434576200343462003b2d565b146200345357604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b031990921690921717905560038101546009830155600782018054600160401b63ffffffff8816026fffffffffffffffff0000000000000000199091161790555f620034ef84620008f5565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b0389811692634f1ef28692620035439216908990600401620046d7565b5f604051808303815f87803b1580156200355b575f80fd5b505af11580156200356e573d5f803e3d5ffd5b50506040805163ffffffff8a811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff16620035ea57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662000c5357604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905262000c18908490620037af565b606f5460ff1615620036ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200375c575067ffffffff00000001604083901c6001600160401b0316105b80156200377d575067ffffffff00000001608083901c6001600160401b0316105b801562003795575067ffffffff0000000160c083901c105b15620037a357506001919050565b505f919050565b919050565b5f62003805826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620038879092919063ffffffff16565b80519091501562000c185780806020019051810190620038269190620046b6565b62000c185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620013e6565b60606200211184845f85855f80866001600160a01b03168587604051620038af91906200465d565b5f6040518083038185875af1925050503d805f8114620038eb576040519150601f19603f3d011682016040523d82523d5f602084013e620038f0565b606091505b50915091506200134b8783838760608315620039705782515f0362003968576001600160a01b0385163b620039685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620013e6565b508162002111565b620021118383815115620039875781518083602001fd5b8060405162461bcd60e51b8152600401620013e6919062003ee9565b61091d80620046fb83390190565b803563ffffffff81168114620037aa575f80fd5b5f60208284031215620039d6575f80fd5b620039e182620039b1565b9392505050565b80356001600160401b0381168114620037aa575f80fd5b6001600160a01b03811681146200292e575f80fd5b5f805f805f805f806103e0808a8c03121562003a2e575f80fd5b62003a398a620039b1565b985062003a4960208b01620039e8565b975062003a5960408b01620039e8565b965062003a6960608b01620039e8565b955060808a0135945060a08a0135935060c08a013562003a8981620039ff565b92508981018b101562003a9a575f80fd5b5060e0890190509295985092959890939650565b5f6020828403121562003abf575f80fd5b5035919050565b5f806040838503121562003ad8575f80fd5b62003ae383620039b1565b915062003af360208401620039e8565b90509250929050565b5f806040838503121562003b0e575f80fd5b82359150602083013562003b2281620039ff565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6002811062003b5e57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b038881168252871660208201526001600160401b038616604082015260e0810162003b98606083018762003b41565b931515608082015260a081019290925260c090910152949350505050565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b038084111562003be65762003be662003bb6565b604051601f8501601f19908116603f0116810190828211818310171562003c115762003c1162003bb6565b8160405280935085815286868601111562003c2a575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f83011262003c53575f80fd5b620039e18383356020850162003bca565b5f805f805f805f60e0888a03121562003c7b575f80fd5b62003c8688620039b1565b965062003c9660208901620039e8565b9550604088013562003ca881620039ff565b9450606088013562003cba81620039ff565b9350608088013562003ccc81620039ff565b925060a08801356001600160401b038082111562003ce8575f80fd5b62003cf68b838c0162003c43565b935060c08a013591508082111562003d0c575f80fd5b5062003d1b8a828b0162003c43565b91505092959891949750929550565b81516001600160a01b031681526101808101602083015162003d5760208401826001600160401b03169052565b50604083015162003d7360408401826001600160a01b03169052565b50606083015162003d8f60608401826001600160401b03169052565b506080830151608083015260a083015162003db560a08401826001600160401b03169052565b5060c083015162003dd160c08401826001600160401b03169052565b5060e083015162003ded60e08401826001600160401b03169052565b50610100838101516001600160401b0316908301526101208084015162003e178285018262003b41565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c0878903121562003e4c575f80fd5b62003e5787620039b1565b955062003e6760208801620039e8565b945062003e7760408801620039e8565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562003eb457818101518382015260200162003e9a565b50505f910152565b5f815180845262003ed581602086016020860162003e98565b601f01601f19169290920160200192915050565b602081525f620039e1602083018462003ebc565b5f6020828403121562003f0e575f80fd5b620039e182620039e8565b5f805f805f8060a0878903121562003f2f575f80fd5b62003f3a87620039b1565b955062003f4a60208801620039b1565b9450604087013593506060870135925060808701356001600160401b038082111562003f74575f80fd5b818901915089601f83011262003f88575f80fd5b81358181111562003f97575f80fd5b8a602082850101111562003fa9575f80fd5b6020830194508093505050509295509295509295565b5f806040838503121562003fd1575f80fd5b823562003ae381620039ff565b803560028110620037aa575f80fd5b5f805f805f805f60e0888a03121562004004575f80fd5b87356200401181620039ff565b965060208801356200402381620039ff565b95506200403360408901620039e8565b94506200404360608901620039e8565b9350608088013592506200405a60a0890162003fde565b915060c0880135905092959891949750929550565b5f806040838503121562004081575f80fd5b6200408c83620039e8565b946020939093013593505050565b5f805f8060808587031215620040ae575f80fd5b620040b985620039b1565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a031215620040ea575f80fd5b8735620040f781620039ff565b965060208801356200410981620039ff565b95506200411960408901620039e8565b9450620041296060890162003fde565b93506080880135925060a08801356001600160401b038111156200414b575f80fd5b620041598a828b0162003c43565b92505060c0880135905092959891949750929550565b5f805f6060848603121562004182575f80fd5b83356200418f81620039ff565b92506200419f60208501620039b1565b915060408401356001600160401b03811115620041ba575f80fd5b8401601f81018613620041cb575f80fd5b620041dc8682356020840162003bca565b9150509250925092565b5f60208284031215620041f7575f80fd5b8135620039e181620039ff565b5f806040838503121562004216575f80fd5b82356200422381620039ff565b915062003af360208401620039b1565b81516001600160a01b03168152610180810160208301516200426060208401826001600160401b03169052565b5060408301516200427c60408401826001600160a01b03169052565b5060608301516200429860608401826001600160401b03169052565b506080830151608083015260a0830151620042be60a08401826001600160401b03169052565b5060c0830151620042da60c08401826001600160401b03169052565b5060e0830151620042f660e08401826001600160401b03169052565b50610100838101516001600160401b039081169184019190915261012080850151821690840152610140808501519091169083015261016080840151620043408285018262003b41565b505092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156200437f576200437f62004348565b5092915050565b80820281158282048414176200091e576200091e62004348565b5f63ffffffff808316818103620043bb57620043bb62004348565b6001019392505050565b5f6001600160a01b038086168352808516602084015250606060408301526200210e606083018462003ebc565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200443360c083018562003ebc565b82810360a084015262004447818562003ebc565b9998505050505050505050565b5f6020828403121562004465575f80fd5b5051919050565b848152606060208201525f62004486606083018662003ebc565b8281036040840152838152838560208301375f602085830101526020601f19601f86011682010191505095945050505050565b5f60208284031215620044ca575f80fd5b8151620039e181620039ff565b6001600160401b038281168282160390808211156200437f576200437f62004348565b6001600160401b0387811682526001600160a01b0387166020830152858116604083015260c082019062004532606084018762003b41565b93909316608082015260a00152949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f826200456c576200456c62004547565b500490565b808201808211156200091e576200091e62004348565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620045af57620045af62004348565b5060010190565b5f82620045c757620045c762004547565b500690565b818103818111156200091e576200091e62004348565b5f81620045f357620045f362004348565b505f190190565b6001600160a01b038881168252871660208201526001600160401b03861660408201525f6200462d606083018762003b41565b84608083015260e060a08301526200464960e083018562003ebc565b90508260c083015298975050505050505050565b5f82516200467081846020870162003e98565b9190910192915050565b6103208101610300808584378201835f5b6001811015620046ac5781518352602092830192909101906001016200468b565b5050509392505050565b5f60208284031215620046c7575f80fd5b81518015158114620039e1575f80fd5b6001600160a01b0383168152604060208201525f62002111604083018462003ebc56fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a2646970667358221220214b2666bb6e2771614820f1fc68d70cdf88a8640c33fd376a6a976c4ac5a78a64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801562000010575f80fd5b5060043610620002fc575f3560e01c80638fd88cc211620001a3578063c4c928c211620000fb578063dbc16976116200009f578063e46761c41162000077578063e46761c41462000896578063f4e9267514620008be578063f9c4c2ae14620008cf575f80fd5b8063dbc16976146200085a578063dde0ff771462000864578063dfdb8c5e146200087f575f80fd5b8063d5073f6f11620000d3578063d5073f6f1462000801578063d547741f1462000818578063d8905812146200082f575f80fd5b8063c4c928c2146200079a578063ceee281d14620007b1578063d02103ca14620007d9575f80fd5b80639e36c5651162000163578063a3c573eb116200013b578063a3c573eb1462000727578063abcb51981462000768578063c1acbc34146200077f575f80fd5b80639e36c56514620006fe578063a217fddf1462000715578063a2967d99146200071d575f80fd5b80638fd88cc2146200067457806391d14854146200068b57806397bf07e814620006c657806399f5634e14620006dd5780639a908e7314620006e7575f80fd5b8063477fa2701162000257578063727885e911620002175780637fb6e76a11620001ef5780637fb6e76a146200062b5780638129fc1c14620006535780638875f03c146200065d575f80fd5b8063727885e914620005c857806374d9c24414620005df5780637975fcfe1462000605575f80fd5b8063477fa27014620004db57806355a71ee014620004e457806360469169146200052757806365c0504d14620005315780637222020f14620005b1575f80fd5b80632072f6c511620002bf5780632f2ff15d11620002975780632f2ff15d146200049957806330c27dde14620004b057806336568abe14620004c4575f80fd5b80632072f6c514620003a7578063248a9ca314620003b15780632528016914620003e5575f80fd5b8063066ec012146200030057806311f6b28714620003315780631489ed10146200034857806315064c9614620003615780631796a1ae1462000380575b5f80fd5b60845462000314906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b6200031462000342366004620039c5565b620008f5565b6200035f6200035936600462003a14565b62000924565b005b606f546200036f9060ff1681565b604051901515815260200162000328565b607e54620003919063ffffffff1681565b60405163ffffffff909116815260200162000328565b6200035f62000b14565b620003d6620003c236600462003aae565b5f9081526034602052604090206001015490565b60405190815260200162000328565b62000465620003f636600462003ac6565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000328565b6200035f620004aa36600462003afc565b62000bf0565b60875462000314906001600160401b031681565b6200035f620004d536600462003afc565b62000c1d565b608654620003d6565b620003d6620004f536600462003ac6565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b620003d662000c57565b6200059c62000542366004620039c5565b607f6020525f908152604090208054600182015460028301546003909301546001600160a01b0392831693928216926001600160401b03600160a01b8404169260ff600160e01b8204811693600160e81b90920416919087565b60405162000328979695949392919062003b62565b6200035f620005c2366004620039c5565b62000c6e565b6200035f620005d936600462003c64565b62000d64565b620005f6620005f0366004620039c5565b620011f2565b60405162000328919062003d2a565b6200061c6200061636600462003e36565b62001324565b60405162000328919062003ee9565b620003916200063c36600462003efd565b60836020525f908152604090205463ffffffff1681565b6200035f62001356565b6200035f6200066e36600462003f19565b6200149d565b6200035f6200068536600462003fbf565b62001753565b6200036f6200069c36600462003afc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6200035f620006d736600462003fed565b62001aed565b620003d662001e05565b62000314620006f83660046200406f565b62001ee6565b6200061c6200070f3660046200409a565b620020e7565b620003d65f81565b620003d662002119565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000328565b6200035f62000779366004620040d3565b620024e1565b6084546200031490600160801b90046001600160401b031681565b6200035f620007ab3660046200416f565b6200275c565b62000391620007c2366004620041e6565b60826020525f908152604090205463ffffffff1681565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b6200035f6200081236600462003aae565b6200279b565b6200035f6200082936600462003afc565b6200283d565b6200061c6040518060400160405280600b81526020016a70657373696d697374696360a81b81525081565b6200035f62002865565b6084546200031490600160401b90046001600160401b031681565b6200035f6200089036600462004204565b62002931565b6200074f7f000000000000000000000000000000000000000000000000000000000000000081565b608054620003919063ffffffff1681565b620008e6620008e0366004620039c5565b62002a81565b60405162000328919062004233565b63ffffffff81165f90815260816020526040812060060154600160401b90046001600160401b03165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620009508162002be1565b6001600160401b03881615620009795760405163306dfc5760e11b815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154600160801b900460ff166001811115620009b157620009b162003b2d565b14620009d0576040516390db0d0760e01b815260040160405180910390fd5b620009e18189898989898962002bed565b6006810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038a16908102919091179091555f9081526002820160205260409020859055600581018690557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000a6562002119565b6040518263ffffffff1660e01b815260040162000a8491815260200190565b5f604051808303815f87803b15801562000a9c575f80fd5b505af115801562000aaf573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff1662000be457608454600160801b90046001600160401b0316158062000b955750608454429062000b8a9062093a8090600160801b90046001600160401b03166200435c565b6001600160401b0316115b8062000bc55750608754429062000bba9062093a80906001600160401b03166200435c565b6001600160401b0316115b1562000be45760405163692baaad60e11b815260040160405180910390fd5b62000bee62002f24565b565b5f8281526034602052604090206001015462000c0c8162002be1565b62000c18838362002f9e565b505050565b6001600160a01b038116331462000c4757604051630b4ad1cd60e31b815260040160405180910390fd5b62000c53828262003022565b5050565b5f608654606462000c69919062004386565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62000c9a8162002be1565b63ffffffff8216158062000cb95750607e5463ffffffff908116908316115b1562000cd857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001810154600160e81b900460ff161562000d1a57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862000d908162002be1565b63ffffffff8816158062000daf5750607e5463ffffffff908116908916115b1562000dce57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001810154600160e81b900460ff161562000e1057604051633b8d3d9960e01b815260040160405180910390fd5b63ffffffff6001600160401b038916111562000e3f57604051634c753f5760e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562000e7c576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062000e969063ffffffff16620043a0565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162000ee390620039a3565b62000ef193929190620043c5565b604051809103905ff08015801562000f0b573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360018111156200110b576200110b62003b2d565b0217905550600384015460098201556040805163ffffffff8e811682526001600160a01b0385811660208401526001600160401b038f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a2604051633892b81160e11b81526001600160a01b03831690637125702290620011b5908d908d9088908e908e908e90600401620043f2565b5f604051808303815f87803b158015620011cd575f80fd5b505af1158015620011e0573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a90982080546001600160a01b038082168c52600160a01b918290046001600160401b0390811690995260018084015491821690985204871690945260058401549092526006830154808616909152600160401b9081900485169091526007820154808516909652850490921690955292939091600160801b900460ff1690811115620012f157620012f162003b2d565b9081600181111562001307576200130762003b2d565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f9081526081602052604090206060906200134b908787878787620030a4565b979650505050505050565b5f54600390610100900460ff161580156200137757505f5460ff8083169116105b620013ef5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461ffff191660ff831617610100179055604080518082018252600b81526a70657373696d697374696360a81b602082015290517f50cadc0c001f05dd4b81db1e92b98d77e718fd2f103fb7b77293e867d329a4c291620014529162003ee9565b60405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620014c98162002be1565b63ffffffff87165f90815260816020526040902060016007820154600160801b900460ff16600181111562001502576200150262003b2d565b146200152157604051633a64d97360e01b815260040160405180910390fd5b60405163ef4eeb3560e01b815263ffffffff881660048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ef4eeb3590602401602060405180830381865afa1580156200158c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620015b2919062004454565b905080620015d35760405163a60721e160e01b815260040160405180910390fd5b5f620015e38a84848b8b620031fb565b6001840154600985015460405163020a49e360e51b81529293506001600160a01b03909116916341493c6091620016239185908b908b906004016200446c565b5f6040518083038186803b1580156200163a575f80fd5b505afa1580156200164d573d5f803e3d5ffd5b50506084805467ffffffffffffffff60801b1916600160801b426001600160401b031602179055505060058301889055600883018790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620016bd62002119565b6040518263ffffffff1660e01b8152600401620016dc91815260200190565b5f604051808303815f87803b158015620016f4575f80fd5b505af115801562001707573d5f803e3d5ffd5b5050604080515f80825260208201529081018b905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600162000b00565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff16158015620018065750336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa158015620017d4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620017fa9190620044b9565b6001600160a01b031614155b156200182557604051630d03687f60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526082602052604081205463ffffffff169081900362001865576040516374a086a360e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff1660018111156200189d576200189d62003b2d565b14620018bc576040516390db0d0760e01b815260040160405180910390fd5b60068101546001600160401b0390811690841681111580620018f5575060068201546001600160401b03600160401b9091048116908516105b15620019145760405163cb23ebdf60e01b815260040160405180910390fd5b805b846001600160401b0316816001600160401b031614620019b8576001600160401b038082165f908152600385016020526040902060010154600160401b900481169086168110156200197b57604051639753965f60e01b815260040160405180910390fd5b6001600160401b039091165f908152600384016020526040812090815560010180546fffffffffffffffffffffffffffffffff1916905562001916565b60068301805467ffffffffffffffff19166001600160401b038716179055620019e28583620044d7565b608480545f90620019fe9084906001600160401b0316620044d7565b82546101009290920a6001600160401b0381810219909316918316021790915586165f8181526003860160205260409081902054905163334d6f6760e11b8152600481019290925260248201526001600160a01b038816915063669adece906044015f604051808303815f87803b15801562001a78575f80fd5b505af115801562001a8b573d5f803e3d5ffd5b505050506001600160401b0385165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62001b198162002be1565b6001600160401b0385165f9081526083602052604090205463ffffffff161562001b56576040516337c8fe0960e11b815260040160405180910390fd5b63ffffffff6001600160401b038616111562001b8557604051634c753f5760e01b815260040160405180910390fd5b6001600160a01b0388165f9081526082602052604090205463ffffffff161562001bc257604051630d409b9360e41b815260040160405180910390fd5b608080545f9190829062001bdc9063ffffffff16620043a0565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f886001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550878160010160146101000a8154816001600160401b0302191690836001600160401b0316021790555088816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555086815f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550848160070160106101000a81548160ff0219169083600181111562001d665762001d6662003b2d565b0217905550600185600181111562001d825762001d8262003b2d565b0362001d9c57600981018490556005810186905562001daf565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a60405162001df196959493929190620044fa565b60405180910390a250505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562001e6c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001e92919062004454565b6084549091505f9062001eb8906001600160401b03600160401b820481169116620044d7565b6001600160401b03169050805f0362001ed3575f9250505090565b62001edf81836200455b565b9250505090565b606f545f9060ff161562001f0d57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362001f44576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f0362001f6e57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff16600181111562001fa65762001fa662003b2d565b1462001fc5576040516390db0d0760e01b815260040160405180910390fd5b608480548691905f9062001fe49084906001600160401b03166200435c565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200201987836200435c565b6006840180546001600160401b0383811667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c018352859020935184559151600193909301805492518716600160401b026fffffffffffffffffffffffffffffffff199093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200210e908690868686620031fb565b90505b949350505050565b6080545f9063ffffffff168082036200213357505f919050565b5f816001600160401b038111156200214f576200214f62003bb6565b60405190808252806020026020018201604052801562002179578160200160208202803683370190505b5090505f5b82811015620021e95760815f6200219783600162004571565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620021c957620021c962004587565b602090810291909101015280620021e0816200459b565b9150506200217e565b505f60205b8360011462002441575f62002205600286620045b6565b620022126002876200455b565b6200221e919062004571565b90505f816001600160401b038111156200223c576200223c62003bb6565b60405190808252806020026020018201604052801562002266578160200160208202803683370190505b5090505f5b82811015620023ed5762002281600184620045cc565b811480156200229c575062002298600288620045b6565b6001145b15620023245785620022b082600262004386565b81518110620022c357620022c362004587565b602002602001015185604051602001620022e7929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002312576200231262004587565b602002602001018181525050620023d8565b856200233282600262004386565b8151811062002345576200234562004587565b6020026020010151868260026200235d919062004386565b6200236a90600162004571565b815181106200237d576200237d62004587565b6020026020010151604051602001620023a0929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620023cb57620023cb62004587565b6020026020010181815250505b80620023e4816200459b565b9150506200226b565b50809450819550838460405160200162002411929190918252602082015260400190565b60405160208183030381529060405280519060200120935082806200243690620045e2565b9350505050620021ee565b5f835f8151811062002457576200245762004587565b602002602001015190505f5b82811015620024d757604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620024ce906200459b565b91505062002463565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5906200250d8162002be1565b607e80545f91908290620025279063ffffffff16620043a0565b91906101000a81548163ffffffff021916908363ffffffff160217905590506001808111156200255b576200255b62003b2d565b86600181111562002570576200257062003b2d565b036200259c57841562002596576040516363d722e760e01b815260040160405180910390fd5b620025bc565b8215620025bc576040516363d722e760e01b815260040160405180910390fd5b6040518060e001604052808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b0316815260200187600181111562002609576200260962003b2d565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f825291829020845181546001600160a01b0391821673ffffffffffffffffffffffffffffffffffffffff199091161782559185015160018281018054958801516001600160401b0316600160a01b026001600160e01b0319909616929094169190911793909317808355938501519093909260ff60e01b1990911690600160e01b908490811115620026c557620026c562003b2d565b02179055506080820151600182018054911515600160e81b0260ff60e81b1990921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002749908c908c908c908c908c908c908c90620045fa565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac620027888162002be1565b62002795848484620032e0565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620027c78162002be1565b683635c9adc5dea00000821180620027e25750633b9aca0082105b156200280157604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f82815260346020526040902060010154620028598162002be1565b62000c18838362003022565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620028918162002be1565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b1580156200290d575f80fd5b505af115801562002920573d5f803e3d5ffd5b505050506200292e620035c6565b50565b336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002978573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200299e9190620044b9565b6001600160a01b031614620029c65760405163696072e960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526082602090815260408083205463ffffffff1683526081909152902060068101546001600160401b03808216600160401b909204161462002a285760405163664316a560e11b815260040160405180910390fd5b600781015463ffffffff8316600160401b9091046001600160401b03161062002a6457604051633e37e23360e01b815260040160405180910390fd5b604080515f81526020810190915262000c189084908490620032e0565b62002ae660408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f9081526081602090815260409182902080546001600160a01b038082168652600160a01b918290046001600160401b039081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a0860152600160401b808204841660c0870152600160801b808304851660e0880152600160c01b9092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff169081111562002bc15762002bc162003b2d565b9081600181111562002bd75762002bd762003b2d565b8152505050919050565b6200292e81336200361e565b5f8062002c0c89600601546001600160401b03600160401b9091041690565b60078a01549091506001600160401b03908116908916101562002c425760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388165f90815260028a01602052604090205491508162002c7d576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b0316111562002cb157604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b03161162002ce45760405163b9b18f5760e01b815260040160405180910390fd5b5f62002cf58a8a8a8a878b620030a4565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162002d2b91906200465d565b602060405180830381855afa15801562002d47573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062002d6c919062004454565b62002d789190620045b6565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162002dbc918991906004016200467a565b602060405180830381865afa15801562002dd8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002dfe9190620046b6565b62002e1c576040516309bde33960e01b815260040160405180910390fd5b5f62002e29848b620044d7565b905062002e8287826001600160401b031662002e4462001e05565b62002e50919062004386565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003661565b80608460088282829054906101000a90046001600160401b031662002ea891906200435c565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558d546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d15390606401620011b5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562002f7d575f80fd5b505af115801562002f90573d5f803e3d5ffd5b5050505062000bee620036ca565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662000c53575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff161562000c53575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f8181526003890160205260408082205493881682529020546060929115801590620030d9575081155b15620030f85760405163340c614f60e11b815260040160405180910390fd5b8062003117576040516366385b5160e01b815260040160405180910390fd5b620031228462003726565b62003140576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a90046001600160a01b03166001600160a01b031663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003250573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003276919062004454565b60058701546008880154604080516020810193909352820152606081018790526001600160e01b031960e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff82161580620032ff5750607e5463ffffffff908116908316115b156200331e57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526082602052604081205463ffffffff16908190036200335e576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918516600160401b9091046001600160401b031603620033ac57604051634f61d51960e01b815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001810154600160e81b900460ff1615620033ee57604051633b8d3d9960e01b815260040160405180910390fd5b600181810154600160e01b900460ff169081111562003411576200341162003b2d565b6007830154600160801b900460ff16600181111562003434576200343462003b2d565b146200345357604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b031990921690921717905560038101546009830155600782018054600160401b63ffffffff8816026fffffffffffffffff0000000000000000199091161790555f620034ef84620008f5565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b0389811692634f1ef28692620035439216908990600401620046d7565b5f604051808303815f87803b1580156200355b575f80fd5b505af11580156200356e573d5f803e3d5ffd5b50506040805163ffffffff8a811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff16620035ea57604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1662000c5357604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905262000c18908490620037af565b606f5460ff1615620036ef57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b0383161080156200375c575067ffffffff00000001604083901c6001600160401b0316105b80156200377d575067ffffffff00000001608083901c6001600160401b0316105b801562003795575067ffffffff0000000160c083901c105b15620037a357506001919050565b505f919050565b919050565b5f62003805826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620038879092919063ffffffff16565b80519091501562000c185780806020019051810190620038269190620046b6565b62000c185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620013e6565b60606200211184845f85855f80866001600160a01b03168587604051620038af91906200465d565b5f6040518083038185875af1925050503d805f8114620038eb576040519150601f19603f3d011682016040523d82523d5f602084013e620038f0565b606091505b50915091506200134b8783838760608315620039705782515f0362003968576001600160a01b0385163b620039685760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620013e6565b508162002111565b620021118383815115620039875781518083602001fd5b8060405162461bcd60e51b8152600401620013e6919062003ee9565b61091d80620046fb83390190565b803563ffffffff81168114620037aa575f80fd5b5f60208284031215620039d6575f80fd5b620039e182620039b1565b9392505050565b80356001600160401b0381168114620037aa575f80fd5b6001600160a01b03811681146200292e575f80fd5b5f805f805f805f806103e0808a8c03121562003a2e575f80fd5b62003a398a620039b1565b985062003a4960208b01620039e8565b975062003a5960408b01620039e8565b965062003a6960608b01620039e8565b955060808a0135945060a08a0135935060c08a013562003a8981620039ff565b92508981018b101562003a9a575f80fd5b5060e0890190509295985092959890939650565b5f6020828403121562003abf575f80fd5b5035919050565b5f806040838503121562003ad8575f80fd5b62003ae383620039b1565b915062003af360208401620039e8565b90509250929050565b5f806040838503121562003b0e575f80fd5b82359150602083013562003b2281620039ff565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6002811062003b5e57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b038881168252871660208201526001600160401b038616604082015260e0810162003b98606083018762003b41565b931515608082015260a081019290925260c090910152949350505050565b634e487b7160e01b5f52604160045260245ffd5b5f6001600160401b038084111562003be65762003be662003bb6565b604051601f8501601f19908116603f0116810190828211818310171562003c115762003c1162003bb6565b8160405280935085815286868601111562003c2a575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f83011262003c53575f80fd5b620039e18383356020850162003bca565b5f805f805f805f60e0888a03121562003c7b575f80fd5b62003c8688620039b1565b965062003c9660208901620039e8565b9550604088013562003ca881620039ff565b9450606088013562003cba81620039ff565b9350608088013562003ccc81620039ff565b925060a08801356001600160401b038082111562003ce8575f80fd5b62003cf68b838c0162003c43565b935060c08a013591508082111562003d0c575f80fd5b5062003d1b8a828b0162003c43565b91505092959891949750929550565b81516001600160a01b031681526101808101602083015162003d5760208401826001600160401b03169052565b50604083015162003d7360408401826001600160a01b03169052565b50606083015162003d8f60608401826001600160401b03169052565b506080830151608083015260a083015162003db560a08401826001600160401b03169052565b5060c083015162003dd160c08401826001600160401b03169052565b5060e083015162003ded60e08401826001600160401b03169052565b50610100838101516001600160401b0316908301526101208084015162003e178285018262003b41565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c0878903121562003e4c575f80fd5b62003e5787620039b1565b955062003e6760208801620039e8565b945062003e7760408801620039e8565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562003eb457818101518382015260200162003e9a565b50505f910152565b5f815180845262003ed581602086016020860162003e98565b601f01601f19169290920160200192915050565b602081525f620039e1602083018462003ebc565b5f6020828403121562003f0e575f80fd5b620039e182620039e8565b5f805f805f8060a0878903121562003f2f575f80fd5b62003f3a87620039b1565b955062003f4a60208801620039b1565b9450604087013593506060870135925060808701356001600160401b038082111562003f74575f80fd5b818901915089601f83011262003f88575f80fd5b81358181111562003f97575f80fd5b8a602082850101111562003fa9575f80fd5b6020830194508093505050509295509295509295565b5f806040838503121562003fd1575f80fd5b823562003ae381620039ff565b803560028110620037aa575f80fd5b5f805f805f805f60e0888a03121562004004575f80fd5b87356200401181620039ff565b965060208801356200402381620039ff565b95506200403360408901620039e8565b94506200404360608901620039e8565b9350608088013592506200405a60a0890162003fde565b915060c0880135905092959891949750929550565b5f806040838503121562004081575f80fd5b6200408c83620039e8565b946020939093013593505050565b5f805f8060808587031215620040ae575f80fd5b620040b985620039b1565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a031215620040ea575f80fd5b8735620040f781620039ff565b965060208801356200410981620039ff565b95506200411960408901620039e8565b9450620041296060890162003fde565b93506080880135925060a08801356001600160401b038111156200414b575f80fd5b620041598a828b0162003c43565b92505060c0880135905092959891949750929550565b5f805f6060848603121562004182575f80fd5b83356200418f81620039ff565b92506200419f60208501620039b1565b915060408401356001600160401b03811115620041ba575f80fd5b8401601f81018613620041cb575f80fd5b620041dc8682356020840162003bca565b9150509250925092565b5f60208284031215620041f7575f80fd5b8135620039e181620039ff565b5f806040838503121562004216575f80fd5b82356200422381620039ff565b915062003af360208401620039b1565b81516001600160a01b03168152610180810160208301516200426060208401826001600160401b03169052565b5060408301516200427c60408401826001600160a01b03169052565b5060608301516200429860608401826001600160401b03169052565b506080830151608083015260a0830151620042be60a08401826001600160401b03169052565b5060c0830151620042da60c08401826001600160401b03169052565b5060e0830151620042f660e08401826001600160401b03169052565b50610100838101516001600160401b039081169184019190915261012080850151821690840152610140808501519091169083015261016080840151620043408285018262003b41565b505092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156200437f576200437f62004348565b5092915050565b80820281158282048414176200091e576200091e62004348565b5f63ffffffff808316818103620043bb57620043bb62004348565b6001019392505050565b5f6001600160a01b038086168352808516602084015250606060408301526200210e606083018462003ebc565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200443360c083018562003ebc565b82810360a084015262004447818562003ebc565b9998505050505050505050565b5f6020828403121562004465575f80fd5b5051919050565b848152606060208201525f62004486606083018662003ebc565b8281036040840152838152838560208301375f602085830101526020601f19601f86011682010191505095945050505050565b5f60208284031215620044ca575f80fd5b8151620039e181620039ff565b6001600160401b038281168282160390808211156200437f576200437f62004348565b6001600160401b0387811682526001600160a01b0387166020830152858116604083015260c082019062004532606084018762003b41565b93909316608082015260a00152949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f826200456c576200456c62004547565b500490565b808201808211156200091e576200091e62004348565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620045af57620045af62004348565b5060010190565b5f82620045c757620045c762004547565b500690565b818103818111156200091e576200091e62004348565b5f81620045f357620045f362004348565b505f190190565b6001600160a01b038881168252871660208201526001600160401b03861660408201525f6200462d606083018762003b41565b84608083015260e060a08301526200464960e083018562003ebc565b90508260c083015298975050505050505050565b5f82516200467081846020870162003e98565b9190910192915050565b6103208101610300808584378201835f5b6001811015620046ac5781518352602092830192909101906001016200468b565b5050509392505050565b5f60208284031215620046c7575f80fd5b81518015158114620039e1575f80fd5b6001600160a01b0383168152604060208201525f62002111604083018462003ebc56fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a2646970667358221220214b2666bb6e2771614820f1fc68d70cdf88a8640c33fd376a6a976c4ac5a78a64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonRollupManagerMock.json b/compiled-contracts/PolygonRollupManagerMock.json
index 5dc98718f..f765c8320 100644
--- a/compiled-contracts/PolygonRollupManagerMock.json
+++ b/compiled-contracts/PolygonRollupManagerMock.json
@@ -34,6 +34,16 @@
"name": "AddressDoNotHaveRequiredRole",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "AllBatchesMustBeVerified",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AllSequencedMustBeVerified",
+ "type": "error"
+ },
{
"inputs": [],
"name": "AllzkEVMSequencedBatchesMustBeVerified",
@@ -44,11 +54,26 @@
"name": "BatchFeeOutOfRange",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "CannotUpdateWithUnconsolidatedPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ChainIDAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "ChainIDOutOfRange",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EmptyVerifySequencesData",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ExceedMaxVerifyBatches",
@@ -64,6 +89,16 @@
"name": "FinalNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceBelowLastVerifiedSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceDoesNotMatchPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalPendingStateNumInvalid",
@@ -89,6 +124,21 @@
"name": "InitNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InitSequenceMustMatchCurrentForkID",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitSequenceNumDoesNotMatchPendingState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidPessimisticProof",
+ "type": "error"
+ },
{
"inputs": [],
"name": "InvalidProof",
@@ -104,11 +154,46 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InvalidRangeMultiplierZkGasPrice",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeSequenceTimeTarget",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollupType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidVerifierType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MustSequenceSomeBatch",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "MustSequenceSomeBlob",
+ "type": "error"
+ },
{
"inputs": [],
"name": "NewAccInputHashDoesNotExist",
@@ -129,6 +214,11 @@
"name": "NewTrustedAggregatorTimeoutMustBeLower",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "NotAllowedAddress",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OldAccInputHashDoesNotExist",
@@ -139,6 +229,11 @@
"name": "OldStateRootDoesNotExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyChainsWithPessimisticProofs",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyEmergencyState",
@@ -149,6 +244,16 @@
"name": "OnlyNotEmergencyState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyRollupAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyStateTransitionChains",
+ "type": "error"
+ },
{
"inputs": [],
"name": "PendingStateDoesNotExist",
@@ -164,11 +269,31 @@
"name": "PendingStateNotConsolidable",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "PendingStateNumExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotEndOfSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotValid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupAddressAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "RollupIDNotAscendingOrder",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupMustExist",
@@ -204,11 +329,21 @@
"name": "UpdateNotCompatible",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "UpdateToOldRollupTypeID",
+ "type": "error"
+ },
{
"inputs": [],
"name": "UpdateToSameRollupTypeID",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "zkGasPriceOfRange",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -238,8 +373,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -247,6 +382,12 @@
"internalType": "uint64",
"name": "lastVerifiedBatchBeforeUpgrade",
"type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "AddExistingRollup",
@@ -281,8 +422,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -296,46 +437,15 @@
"internalType": "string",
"name": "description",
"type": "string"
- }
- ],
- "name": "AddNewRollupType",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
- "name": "exitRoot",
+ "name": "programVKey",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
}
],
- "name": "ConsolidatePendingState",
+ "name": "AddNewRollupType",
"type": "event"
},
{
@@ -432,62 +542,6 @@
"name": "OnSequenceBatches",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
- }
- ],
- "name": "OverridePendingState",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "storedStateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "provedStateRoot",
- "type": "bytes32"
- }
- ],
- "name": "ProveNonDeterministicPendingState",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [
@@ -567,26 +621,25 @@
"anonymous": false,
"inputs": [
{
- "indexed": false,
- "internalType": "uint256",
- "name": "newBatchFee",
- "type": "uint256"
- }
- ],
- "name": "SetBatchFee",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
{
"indexed": false,
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
}
],
- "name": "SetMultiplierBatchFee",
+ "name": "RollbackBatches",
"type": "event"
},
{
@@ -594,12 +647,12 @@
"inputs": [
{
"indexed": false,
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
+ "internalType": "uint256",
+ "name": "newBatchFee",
+ "type": "uint256"
}
],
- "name": "SetPendingStateTimeout",
+ "name": "SetBatchFee",
"type": "event"
},
{
@@ -618,14 +671,26 @@
{
"anonymous": false,
"inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "newRollupTypeID",
+ "type": "uint32"
+ },
{
"indexed": false,
"internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
+ "name": "lastVerifiedBatchBeforeUpgrade",
"type": "uint64"
}
],
- "name": "SetTrustedAggregatorTimeout",
+ "name": "UpdateRollup",
"type": "event"
},
{
@@ -633,12 +698,12 @@
"inputs": [
{
"indexed": false,
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
+ "internalType": "string",
+ "name": "rollupManagerVersion",
+ "type": "string"
}
],
- "name": "SetVerifyBatchTimeTarget",
+ "name": "UpdateRollupManagerVersion",
"type": "event"
},
{
@@ -652,34 +717,9 @@
},
{
"indexed": false,
- "internalType": "uint32",
- "name": "newRollupTypeID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "lastVerifiedBatchBeforeUpgrade",
- "type": "uint64"
- }
- ],
- "name": "UpdateRollup",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
+ "internalType": "uint64",
+ "name": "numBatch",
+ "type": "uint64"
},
{
"indexed": false,
@@ -700,54 +740,30 @@
"type": "address"
}
],
- "name": "VerifyBatches",
+ "name": "VerifyBatchesTrustedAggregator",
"type": "event"
},
{
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
{
- "indexed": false,
"internalType": "bytes32",
- "name": "exitRoot",
+ "name": "",
"type": "bytes32"
- },
- {
- "indexed": true,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
}
],
- "name": "VerifyBatchesTrustedAggregator",
- "type": "event"
+ "stateMutability": "view",
+ "type": "function"
},
{
"inputs": [],
- "name": "DEFAULT_ADMIN_ROLE",
+ "name": "ROLLUP_MANAGER_VERSION",
"outputs": [
{
- "internalType": "bytes32",
+ "internalType": "string",
"name": "",
- "type": "bytes32"
+ "type": "string"
}
],
"stateMutability": "view",
@@ -768,7 +784,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -784,13 +800,18 @@
},
{
"internalType": "bytes32",
- "name": "genesis",
+ "name": "initRoot",
"type": "bytes32"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addExistingRollup",
@@ -806,7 +827,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -816,8 +837,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -829,6 +850,11 @@
"internalType": "string",
"name": "description",
"type": "string"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addNewRollupType",
@@ -881,24 +907,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "consolidatePendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [
{
@@ -949,6 +957,25 @@
"stateMutability": "nonpayable",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newStateRoot",
+ "type": "uint256"
+ }
+ ],
+ "name": "exposed_checkStateRootInsidePrime",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
{
"inputs": [],
"name": "getBatchFee",
@@ -975,6 +1002,40 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "l1InfoTreeRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newPessimisticRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getInputPessimisticBytes",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -1094,52 +1155,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "batchNum",
- "type": "uint64"
- }
- ],
- "name": "getRollupPendingStateTransitions",
- "outputs": [
- {
- "components": [
- {
- "internalType": "uint64",
- "name": "timestamp",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- }
- ],
- "internalType": "struct LegacyZKEVMStateVariables.PendingState",
- "name": "",
- "type": "tuple"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1237,58 +1252,7 @@
"type": "function"
},
{
- "inputs": [
- {
- "internalType": "address",
- "name": "trustedAggregator",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "_pendingStateTimeout",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "_trustedAggregatorTimeout",
- "type": "uint64"
- },
- {
- "internalType": "address",
- "name": "admin",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "timelock",
- "type": "address"
- },
- {
- "internalType": "address",
- "name": "emergencyCouncil",
- "type": "address"
- },
- {
- "internalType": "contract PolygonZkEVMExistentEtrog",
- "name": "polygonZkEVM",
- "type": "address"
- },
- {
- "internalType": "contract IVerifierRollup",
- "name": "zkEVMVerifier",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "zkEVMForkID",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "zkEVMChainID",
- "type": "uint64"
- }
- ],
+ "inputs": [],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
@@ -1345,30 +1309,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "isPendingStateConsolidable",
- "outputs": [
- {
- "internalType": "bool",
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [],
"name": "lastAggregationTimestamp",
@@ -1395,19 +1335,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "multiplierBatchFee",
- "outputs": [
- {
- "internalType": "uint16",
- "name": "",
- "type": "uint16"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1445,67 +1372,6 @@
"stateMutability": "nonpayable",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "newLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "newStateRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
- }
- ],
- "name": "overridePendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "pendingStateTimeout",
- "outputs": [
- {
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [],
"name": "pol",
@@ -1534,48 +1400,18 @@
},
{
"inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
{
"internalType": "bytes32",
- "name": "newLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "role",
"type": "bytes32"
},
{
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
}
],
- "name": "proveNonDeterministicPendingState",
+ "name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1593,7 +1429,7 @@
"type": "address"
}
],
- "name": "renounceRole",
+ "name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1601,17 +1437,17 @@
{
"inputs": [
{
- "internalType": "bytes32",
- "name": "role",
- "type": "bytes32"
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
},
{
- "internalType": "address",
- "name": "account",
- "type": "address"
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
}
],
- "name": "revokeRole",
+ "name": "rollbackBatches",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1659,64 +1495,152 @@
"name": "rollupIDToRollupData",
"outputs": [
{
- "internalType": "contract IPolygonRollupBase",
- "name": "rollupContract",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "chainID",
- "type": "uint64"
- },
- {
- "internalType": "contract IVerifierRollup",
- "name": "verifier",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "forkID",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "lastLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "uint64",
- "name": "lastBatchSequenced",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingState",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingStateConsolidated",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatchBeforeUpgrade",
- "type": "uint64"
- },
+ "components": [
+ {
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingState",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingStateConsolidated",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturn",
+ "name": "rollupData",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
{
- "internalType": "uint64",
- "name": "rollupTypeID",
- "type": "uint64"
- },
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ }
+ ],
+ "name": "rollupIDToRollupDataV2",
+ "outputs": [
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
- "type": "uint8"
+ "components": [
+ {
+ "internalType": "address",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastPessimisticRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturnV2",
+ "name": "rollupData",
+ "type": "tuple"
}
],
"stateMutability": "view",
@@ -1751,7 +1675,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -1761,8 +1685,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -1774,6 +1698,11 @@
"internalType": "bytes32",
"name": "genesis",
"type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"stateMutability": "view",
@@ -1795,51 +1724,22 @@
{
"inputs": [
{
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
- }
- ],
- "name": "setMultiplierBatchFee",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
- }
- ],
- "name": "setPendingStateTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
{
- "internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
- "type": "uint64"
- }
- ],
- "name": "setTrustedAggregatorTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
{
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "lastPessimisticRoot",
+ "type": "bytes32"
}
],
- "name": "setVerifyBatchTimeTarget",
+ "name": "setRollupData",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1870,19 +1770,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "trustedAggregatorTimeout",
- "outputs": [
- {
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1907,16 +1794,21 @@
"type": "function"
},
{
- "inputs": [],
- "name": "verifyBatchTimeTarget",
- "outputs": [
+ "inputs": [
{
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
+ "internalType": "contract ITransparentUpgradeableProxy",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "newRollupTypeID",
+ "type": "uint32"
}
],
- "stateMutability": "view",
+ "name": "updateRollupByRollupAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -1962,7 +1854,7 @@
"type": "bytes32[24]"
}
],
- "name": "verifyBatches",
+ "name": "verifyBatchesTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1975,19 +1867,9 @@
"type": "uint32"
},
{
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
},
{
"internalType": "bytes32",
@@ -1996,28 +1878,23 @@
},
{
"internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "newPessimisticRoot",
"type": "bytes32"
},
{
- "internalType": "address",
- "name": "beneficiary",
- "type": "address"
- },
- {
- "internalType": "bytes32[24]",
+ "internalType": "bytes",
"name": "proof",
- "type": "bytes32[24]"
+ "type": "bytes"
}
],
- "name": "verifyBatchesTrustedAggregator",
+ "name": "verifyPessimisticTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
- "bytecode": "0x60e060405234801562000010575f80fd5b50604051620061893803806200618983398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051615f99620001f05f395f81816109d2015281816122910152613b0d01525f818161079a01528181612de50152613dfb01525f818161092c015281816112e90152818161149101528181611f7b0152613cf00152615f995ff3fe608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212200ce6fcb9a490f6b26945426ab051c2a0bf7369618afe91f355793beb03787e1964736f6c63430008140033",
- "deployedBytecode": "0x608060405234801562000010575f80fd5b5060043610620002b4575f3560e01c80630645af0914620002b8578063066ec01214620002d1578063080b311114620002fd5780630a0d9fbe14620003255780630e36f582146200034057806311f6b287146200035757806312b86e19146200036e5780631489ed10146200038557806315064c96146200039c5780631608859c14620003aa5780631796a1ae14620003c15780631816b7e514620003e85780632072f6c514620003ff578063248a9ca3146200040957806325280169146200042f5780632f2ff15d14620004e357806330c27dde14620004fa57806336568abe146200050e578063394218e91462000525578063477fa270146200053c57806355a71ee0146200054557806360469169146200058857806365c0504d14620005925780637222020f1462000640578063727885e914620006575780637975fcfe146200066e5780637fb6e76a1462000694578063841b24d714620006bc57806387c20c0114620006d75780638bd4f07114620006ee5780638f698ec5146200070557806391d14854146200071c57806399f5634e14620007335780639a908e73146200073d5780639c9f3dfe1462000754578063a066215c146200076b578063a217fddf1462000782578063a2967d99146200078a578063a3c573eb1462000794578063afd23cbe14620007cb578063b99d0ad714620007f5578063c1acbc3414620008cc578063c4c928c214620008e7578063ceee281d14620008fe578063d02103ca1462000926578063d5073f6f146200094e578063d547741f1462000965578063d939b315146200097c578063dbc169761462000990578063dde0ff77146200099a578063e0bfd3d214620009b5578063e46761c414620009cc578063f34eb8eb14620009f4578063f4e926751462000a0b578063f9c4c2ae1462000a1c575b5f80fd5b620002cf620002c936600462004795565b62000b32565b005b608454620002e5906001600160401b031681565b604051620002f491906200486a565b60405180910390f35b620003146200030e36600462004892565b62000f61565b6040519015158152602001620002f4565b608554620002e590600160401b90046001600160401b031681565b620002cf62000351366004620048c8565b62000f8a565b620002e5620003683660046200494f565b62001221565b620002cf6200037f3660046200497d565b62001240565b620002cf6200039636600462004a0f565b620013e8565b606f54620003149060ff1681565b620002cf620003bb36600462004892565b62001570565b607e54620003d29063ffffffff1681565b60405163ffffffff9091168152602001620002f4565b620002cf620003f936600462004a94565b62001603565b620002cf620016ae565b620004206200041a36600462004abe565b62001773565b604051908152602001620002f4565b620004af6200044036600462004892565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b03908116918301919091529282015190921690820152606001620002f4565b620002cf620004f436600462004ad6565b62001787565b608754620002e5906001600160401b031681565b620002cf6200051f36600462004ad6565b620017a9565b620002cf6200053636600462004b07565b620017e3565b60865462000420565b620004206200055636600462004892565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200042062001891565b620005f6620005a33660046200494f565b607f6020525f90815260409020805460018201546002909201546001600160a01b0391821692918216916001600160401b03600160a01b8204169160ff600160e01b8304811692600160e81b9004169086565b604080516001600160a01b0397881681529690951660208701526001600160401b039093169385019390935260ff166060840152901515608083015260a082015260c001620002f4565b620002cf620006513660046200494f565b620018a8565b620002cf6200066836600462004bdc565b62001990565b620006856200067f36600462004ca2565b62001ddb565b604051620002f4919062004d55565b620003d2620006a536600462004b07565b60836020525f908152604090205463ffffffff1681565b608454620002e590600160c01b90046001600160401b031681565b620002cf620006e836600462004a0f565b62001e0d565b620002cf620006ff3660046200497d565b62002128565b620002cf6200071636600462004d69565b620021df565b620003146200072d36600462004ad6565b62002263565b620004206200228d565b620002e56200074e36600462004e14565b62002373565b620002cf6200076536600462004b07565b6200253a565b620002cf6200077c36600462004b07565b620025dc565b620004205f81565b620004206200267a565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b604051620002f4919062004e3f565b608554620007e190600160801b900461ffff1681565b60405161ffff9091168152602001620002f4565b6200088a6200080636600462004892565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff969096168152608186528381206001600160401b03958616825260040186528390208351918201845280548086168352600160401b9004909416948101949094526001830154918401919091526002909101549082015290565b604051620002f4919081516001600160401b03908116825260208084015190911690820152604082810151908201526060918201519181019190915260800190565b608454620002e590600160801b90046001600160401b031681565b620002cf620008f836600462004e53565b62002a2f565b620003d26200090f36600462004ee4565b60826020525f908152604090205463ffffffff1681565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf6200095f36600462004abe565b62002cf2565b620002cf6200097636600462004ad6565b62002d7c565b608554620002e5906001600160401b031681565b620002cf62002d9e565b608454620002e590600160401b90046001600160401b031681565b620002cf620009c636600462004f13565b62002e57565b620007bc7f000000000000000000000000000000000000000000000000000000000000000081565b620002cf62000a0536600462004f8b565b62002f19565b608054620003d29063ffffffff1681565b62000ab262000a2d3660046200494f565b60816020525f9081526040902080546001820154600583015460068401546007909401546001600160a01b0380851695600160a01b958690046001600160401b039081169692861695929092048216939282821692600160401b808404821693600160801b808204841694600160c01b90920484169380831693830416910460ff168c565b604080516001600160a01b039d8e1681526001600160401b039c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620002f4565b5f54600290610100900460ff1615801562000b5357505f5460ff8083169116105b62000b7b5760405162461bcd60e51b815260040162000b72906200501d565b60405180910390fd5b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038e8116919091029190911790915567016345785d8a00006086558c166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b17905562000bfb620030fb565b62000c155f8051602062005f448339815191528c62003167565b62000c215f8862003167565b62000c3b5f8051602062005e248339815191528862003167565b62000c555f8051602062005ea48339815191528862003167565b62000c6f5f8051602062005dc48339815191528862003167565b62000c895f8051602062005e048339815191528962003167565b62000ca35f8051602062005f248339815191528962003167565b62000cbd5f8051602062005e448339815191528962003167565b62000cd75f8051602062005ec48339815191528962003167565b62000cff5f8051602062005f448339815191525f8051602062005da483398151915262003173565b62000d195f8051602062005da48339815191528962003167565b62000d335f8051602062005de48339815191528962003167565b62000d5b5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b62000d755f8051602062005f048339815191528762003167565b62000d8f5f8051602062005ee48339815191528762003167565b6073546074546001600160401b03600160401b9092048216911680821462000dca57604051632e4cc54360e11b815260040160405180910390fd5b5f62000def888888885f60745f9054906101000a90046001600160401b0316620031c6565b6001600160401b038381165f81815260756020908152604080832054600287018352818420558885168084526072808452828520600389018552948390208554815560018087018054919092018054918a166001600160401b03198084168217835593546001600160801b0319938416909117600160401b91829004909b1681029a909a17905560068a01805490911690931797870297909717909155600787018054909616909417909455607a54606f549390915290549251635d6717a560e01b81529394506001600160a01b038c811694635d6717a59462000eec9493831693600160581b9004909216916076916077919060040162005112565b5f604051808303815f87803b15801562000f04575f80fd5b505af115801562000f17573d5f803e3d5ffd5b50505f805461ff0019169055505060405160ff851681525f8051602062005e848339815191529350602001915062000f4c9050565b60405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062000f819083620033e7565b90505b92915050565b5f54600290610100900460ff1615801562000fab57505f5460ff8083169116105b62000fca5760405162461bcd60e51b815260040162000b72906200501d565b5f805461010060ff841661ffff199092169190911717905560858054608480546001600160c01b0316600160c01b6001600160401b038a8116919091029190911790915567016345785d8a000060865588166001600160801b03199091161760e160431b1761ffff60801b19166101f560811b1790556200104a620030fb565b620010645f8051602062005f448339815191528862003167565b620010705f8462003167565b6200108a5f8051602062005e248339815191528462003167565b620010a45f8051602062005ea48339815191528462003167565b620010be5f8051602062005dc48339815191528462003167565b620010d85f8051602062005e048339815191528562003167565b620010f25f8051602062005f248339815191528562003167565b6200110c5f8051602062005e448339815191528562003167565b620011265f8051602062005ec48339815191528562003167565b6200114e5f8051602062005f448339815191525f8051602062005da483398151915262003173565b620011685f8051602062005da48339815191528562003167565b620011825f8051602062005de48339815191528562003167565b620011aa5f8051602062005f048339815191525f8051602062005ee483398151915262003173565b620011c45f8051602062005f048339815191528362003167565b620011de5f8051602062005ee48339815191528362003167565b620011ea5f3362003167565b5f805461ff001916905560405160ff821681525f8051602062005e848339815191529060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812062000f84906200342b565b5f8051602062005f448339815191526200125a816200349a565b63ffffffff89165f90815260816020526040902062001280818a8a8a8a8a8a8a620034a6565b600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b90041615620012e7576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620013206200267a565b6040518263ffffffff1660e01b81526004016200133f91815260200190565b5f604051808303815f87803b15801562001357575f80fd5b505af11580156200136a573d5f803e3d5ffd5b5050608480546001600160c01b031661127560c71b1790555050604080516001600160401b03881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b5f8051602062005f4483398151915262001402816200349a565b63ffffffff89165f90815260816020526040902062001428818a8a8a8a8a8a8a62003822565b600681018054600160401b600160801b031916600160401b6001600160401b038a81169182029290921783555f9081526002840160205260409020879055600583018890559054600160801b900416156200148f576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d620014c86200267a565b6040518263ffffffff1660e01b8152600401620014e791815260200190565b5f604051808303815f87803b158015620014ff575f80fd5b505af115801562001512573d5f803e3d5ffd5b50505050336001600160a01b03168a63ffffffff167fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d389888a6040516200155c9392919062005166565b60405180910390a350505050505050505050565b63ffffffff82165f9081526081602052604090206200159e5f8051602062005f448339815191523362002263565b620015f257606f5460ff1615620015c857604051630bc011ff60e21b815260040160405180910390fd5b620015d48183620033e7565b620015f257604051630674f25160e11b815260040160405180910390fd5b620015fe818362003c0e565b505050565b5f8051602062005ec48339815191526200161d816200349a565b6103e88261ffff1610806200163757506103ff8261ffff16115b156200165657604051630984a67960e31b815260040160405180910390fd5b6085805461ffff60801b1916600160801b61ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b620016c85f8051602062005f048339815191523362002263565b6200176757608454600160801b90046001600160401b0316158062001718575060845442906200170d9062093a8090600160801b90046001600160401b03166200519b565b6001600160401b0316115b8062001748575060875442906200173d9062093a80906001600160401b03166200519b565b6001600160401b0316115b15620017675760405163692baaad60e11b815260040160405180910390fd5b6200177162003df9565b565b5f9081526034602052604090206001015490565b620017928262001773565b6200179d816200349a565b620015fe838362003e73565b6001600160a01b0381163314620017d357604051630b4ad1cd60e31b815260040160405180910390fd5b620017df828262003ede565b5050565b5f8051602062005ec4833981519152620017fd816200349a565b606f5460ff166200183f576084546001600160401b03600160c01b9091048116908316106200183f5760405163401636df60e01b815260040160405180910390fd5b608480546001600160c01b0316600160c01b6001600160401b038516021790556040517f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190620016a29084906200486a565b5f6086546064620018a39190620051c5565b905090565b5f8051602062005e04833981519152620018c2816200349a565b63ffffffff82161580620018e15750607e5463ffffffff908116908316115b156200190057604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f60205260409020600180820154600160e81b900460ff16151590036200194657604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b5f8051602062005f24833981519152620019aa816200349a565b63ffffffff88161580620019c95750607e5463ffffffff908116908916115b15620019e857604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f60205260409020600180820154600160e81b900460ff161515900362001a2e57604051633b8d3d9960e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff161562001a6b576040516337c8fe0960e11b815260040160405180910390fd5b608080545f9190829062001a859063ffffffff16620051df565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b0390921691309162001ad2906200475b565b62001ae09392919062005204565b604051809103905ff08015801562001afa573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162001d5e949392919063ffffffff9490941684526001600160a01b0392831660208501526001600160401b0391909116604084015216606082015260800190565b60405180910390a2604051633892b81160e11b81526001600160a01b0383169063712570229062001d9e908d908d9088908e908e908e906004016200523a565b5f604051808303815f87803b15801562001db6575f80fd5b505af115801562001dc9573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f90815260816020526040902060609062001e0290878787878762003f47565b979650505050505050565b606f5460ff161562001e3257604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f9081526081602090815260408083206084546001600160401b038a81168652600383019094529190932060010154429262001e8092600160c01b9004811691166200519b565b6001600160401b0316111562001ea957604051638a0704d360e01b815260040160405180910390fd5b6103e862001eb888886200529c565b6001600160401b0316111562001ee157604051635acfba9d60e11b815260040160405180910390fd5b62001ef3818989898989898962003822565b62001eff818762004081565b6085546001600160401b03165f036200200657600681018054600160401b600160801b031916600160401b6001600160401b038981169182029290921783555f9081526002840160205260409020869055600583018790559054600160801b9004161562001f79576006810180546001600160801b031690555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001fb26200267a565b6040518263ffffffff1660e01b815260040162001fd191815260200190565b5f604051808303815f87803b15801562001fe9575f80fd5b505af115801562001ffc573d5f803e3d5ffd5b50505050620020cf565b620020118162004278565b600681018054600160801b90046001600160401b03169060106200203583620052bf565b82546001600160401b039182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154600160801b900487165f90815260048a01909352949091209251835492518616600160401b026001600160801b03199093169516949094171781559151600183015551600290910155505b336001600160a01b03168963ffffffff167faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4888789604051620021159392919062005166565b60405180910390a3505050505050505050565b606f5460ff16156200214d57604051630bc011ff60e21b815260040160405180910390fd5b63ffffffff88165f908152608160205260409020620021738189898989898989620034a6565b6001600160401b0387165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620021d462003df9565b505050505050505050565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620017df578181815181106200221b576200221b620052e5565b602002602001015160815f836001620022359190620052f9565b63ffffffff16815260208101919091526040015f2060050155806200225a816200530f565b915050620021fc565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401620022dd919062004e3f565b602060405180830381865afa158015620022f9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200231f91906200532a565b6084549091505f9062002345906001600160401b03600160401b8204811691166200529c565b6001600160401b03169050805f0362002360575f9250505090565b6200236c818362005356565b9250505090565b606f545f9060ff16156200239a57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620023d1576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f03620023fb57604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200242d9084906001600160401b03166200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200246287836200519b565b6006840180546001600160401b038084166001600160401b03199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b0190915292909320905181559151600192909201805491518416600160401b026001600160801b031990921692909316919091171790559050620024f08362004278565b8363ffffffff167f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25826040516200252891906200486a565b60405180910390a29695505050505050565b5f8051602062005ec483398151915262002554816200349a565b606f5460ff166200258f576085546001600160401b03908116908316106200258f5760405163048a05a960e41b815260040160405180910390fd5b608580546001600160401b0319166001600160401b0384161790556040517fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590620016a29084906200486a565b5f8051602062005ec4833981519152620025f6816200349a565b62015180826001600160401b031611156200262457604051631c0cfbfd60e31b815260040160405180910390fd5b60858054600160401b600160801b031916600160401b6001600160401b038516021790556040517f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890620016a29084906200486a565b6080545f9063ffffffff168082036200269457505f919050565b5f816001600160401b03811115620026b057620026b062004b23565b604051908082528060200260200182016040528015620026da578160200160208202803683370190505b5090505f5b828110156200274a5760815f620026f8836001620052f9565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200272a576200272a620052e5565b60209081029190910101528062002741816200530f565b915050620026df565b505f60205b836001146200298a575f620027666002866200536c565b6200277360028762005356565b6200277f9190620052f9565b90505f816001600160401b038111156200279d576200279d62004b23565b604051908082528060200260200182016040528015620027c7578160200160208202803683370190505b5090505f5b828110156200293e57620027e260018462005382565b81148015620027fd5750620027f96002886200536c565b6001145b156200287d578562002811826002620051c5565b81518110620028245762002824620052e5565b6020026020010151856040516020016200284092919062005398565b604051602081830303815290604052805190602001208282815181106200286b576200286b620052e5565b60200260200101818152505062002929565b856200288b826002620051c5565b815181106200289e576200289e620052e5565b602002602001015186826002620028b69190620051c5565b620028c3906001620052f9565b81518110620028d657620028d6620052e5565b6020026020010151604051602001620028f192919062005398565b604051602081830303815290604052805190602001208282815181106200291c576200291c620052e5565b6020026020010181815250505b8062002935816200530f565b915050620027cc565b5080945081955083846040516020016200295a92919062005398565b60405160208183030381529060405280519060200120935082806200297f90620053a6565b93505050506200274f565b5f835f81518110620029a057620029a0620052e5565b602002602001015190505f5b8281101562002a25578184604051602001620029ca92919062005398565b6040516020818303038152906040528051906020012091508384604051602001620029f792919062005398565b604051602081830303815290604052805190602001209350808062002a1c906200530f565b915050620029ac565b5095945050505050565b5f8051602062005dc483398151915262002a49816200349a565b63ffffffff8416158062002a685750607e5463ffffffff908116908516115b1562002a8757604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526082602052604081205463ffffffff169081900362002ac7576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918716600160401b9091046001600160401b03160362002b1557604051634f61d51960e01b815260040160405180910390fd5b63ffffffff86165f908152607f60205260409020600180820154600160e81b900460ff161515900362002b5b57604051633b8d3d9960e01b815260040160405180910390fd5b60018101546007830154600160801b900460ff908116600160e01b909204161462002b9957604051635aa0d5f160e11b815260040160405180910390fd5b6001808201805491840180546001600160a01b031981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b0319909216909217179055600782018054600160401b63ffffffff8a1602600160401b600160801b03199091161790555f62002c188462001221565b6007840180546001600160401b0319166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b038b811692634f1ef2869262002c6d9216908b908b90600401620053be565b5f604051808303815f87803b15801562002c85575f80fd5b505af115801562002c98573d5f803e3d5ffd5b50506040805163ffffffff8c811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b5f8051602062005de483398151915262002d0c816200349a565b683635c9adc5dea0000082118062002d275750633b9aca0082105b1562002d4657604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b290602001620016a2565b62002d878262001773565b62002d92816200349a565b620015fe838362003ede565b5f8051602062005e4483398151915262002db8816200349a565b608780546001600160401b031916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e33575f80fd5b505af115801562002e46573d5f803e3d5ffd5b5050505062002e5462004341565b50565b5f8051602062005ea483398151915262002e71816200349a565b6001600160401b0384165f9081526083602052604090205463ffffffff161562002eae576040516337c8fe0960e11b815260040160405180910390fd5b6001600160a01b0387165f9081526082602052604090205463ffffffff161562002eeb57604051630d409b9360e41b815260040160405180910390fd5b5f62002efc88888888875f620031c6565b5f8080526002909101602052604090209390935550505050505050565b5f8051602062005e2483398151915262002f33816200349a565b607e80545f9190829062002f4d9063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160401b031681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b52898989898989604051620030e996959493929190620053fd565b60405180910390a25050505050505050565b5f54610100900460ff16620017715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000b72565b620017df828262003e73565b5f6200317f8362001773565b5f84815260346020526040808220600101859055519192508391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b608080545f9182918290620031e19063ffffffff16620051df565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f876001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550858260010160146101000a8154816001600160401b0302191690836001600160401b0316021790555086826001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555084825f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620033d49594939291906001600160401b0395861681526001600160a01b03949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b6085546001600160401b038281165f90815260048501602052604081205490924292620034199291811691166200519b565b6001600160401b031611159392505050565b60068101545f90600160801b90046001600160401b0316156200347d575060068101546001600160401b03600160801b90910481165f9081526004909201602052604090912054600160401b90041690565b5060060154600160401b90046001600160401b031690565b919050565b62002e54813362004399565b60078801545f906001600160401b039081169087161015620034db5760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b038816156200357b5760068901546001600160401b03600160801b90910481169089161115620035255760405163bb14c20560e01b815260040160405180910390fd5b506001600160401b038088165f90815260048a0160205260409020600281015481549092888116600160401b90920416146200357457604051632bd2e3e760e01b815260040160405180910390fd5b50620035ef565b506001600160401b0385165f90815260028901602052604090205480620035b5576040516324cbdcc360e11b815260040160405180910390fd5b60068901546001600160401b03600160401b90910481169087161115620035ef57604051630f2b74f160e11b815260040160405180910390fd5b60068901546001600160401b03600160801b90910481169088161180620036285750876001600160401b0316876001600160401b031611155b806200364c575060068901546001600160401b03600160c01b909104811690881611155b156200366b5760405163bfa7079f60e01b815260040160405180910390fd5b6001600160401b038781165f90815260048b016020526040902054600160401b9004811690861614620036b1576040516332a2a77f60e01b815260040160405180910390fd5b5f620036c28a888888868962003f47565b90505f5f8051602062005e64833981519152600283604051620036e6919062005449565b602060405180830381855afa15801562003702573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200372791906200532a565b6200373391906200536c565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620037779188919060040162005466565b602060405180830381865afa15801562003793573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620037b99190620054a2565b620037d7576040516309bde33960e01b815260040160405180910390fd5b6001600160401b0389165f90815260048c016020526040902060020154859003620038155760405163a47276bd60e01b815260040160405180910390fd5b5050505050505050505050565b5f806200382f8a6200342b565b60078b01549091506001600160401b039081169089161015620038655760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b03891615620039075760068a01546001600160401b03600160801b9091048116908a161115620038af5760405163bb14c20560e01b815260040160405180910390fd5b6001600160401b03808a165f90815260048c01602052604090206002810154815490945090918a8116600160401b90920416146200390057604051632bd2e3e760e01b815260040160405180910390fd5b5062003976565b6001600160401b0388165f90815260028b01602052604090205491508162003942576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200397657604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620039a95760405163b9b18f5760e01b815260040160405180910390fd5b5f620039ba8b8a8a8a878b62003f47565b90505f5f8051602062005e64833981519152600283604051620039de919062005449565b602060405180830381855afa158015620039fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a1f91906200532a565b62003a2b91906200536c565b60018d0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a9162003a6f9189919060040162005466565b602060405180830381865afa15801562003a8b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ab19190620054a2565b62003acf576040516309bde33960e01b815260040160405180910390fd5b5f62003adc848b6200529c565b905062003b3587826001600160401b031662003af76200228d565b62003b039190620051c5565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190620043c3565b80608460088282829054906101000a90046001600160401b031662003b5b91906200519b565b82546101009290920a6001600160401b0381810219909316918316021790915560848054600160801b600160c01b031916600160801b428416021790558e546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d153906064015f604051808303815f87803b15801562003be8575f80fd5b505af115801562003bfb573d5f803e3d5ffd5b5050505050505050505050505050505050565b60068201546001600160401b03600160c01b909104811690821611158062003c4d575060068201546001600160401b03600160801b9091048116908216115b1562003c6c5760405163d086b70b60e01b815260040160405180910390fd5b6001600160401b038181165f81815260048501602090815260408083208054600689018054600160401b600160801b031916600160401b92839004909816918202979097178755600280830154828752908a0190945291909320919091556001820154600587015583546001600160c01b0316600160c01b909302929092179092557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62003d276200267a565b6040518263ffffffff1660e01b815260040162003d4691815260200190565b5f604051808303815f87803b15801562003d5e575f80fd5b505af115801562003d71573d5f803e3d5ffd5b505085546001600160a01b03165f90815260826020908152604091829020546002870154600188015484516001600160401b03898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003e52575f80fd5b505af115801562003e65573d5f803e3d5ffd5b505050506200177162004417565b62003e7f828262002263565b620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b62003eea828262002263565b15620017df575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003f7c575081155b1562003f9b5760405163340c614f60e11b815260040160405180910390fd5b8062003fba576040516366385b5160e01b815260040160405180910390fd5b62003fc58462004473565b62003fe3576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516001600160601b03193360601b16602082015260348101889052605481018590526001600160c01b031960c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f6200408d836200342b565b9050815f806200409e84846200529c565b6085546001600160401b0391821692505f91620040c491600160401b9004164262005382565b90505b846001600160401b0316846001600160401b0316146200414d576001600160401b038085165f9081526003890160205260409020600181015490911682101562004128576001810154600160401b90046001600160401b0316945062004146565b6200413486866200529c565b6001600160401b03169350506200414d565b50620040c7565b5f6200415a848462005382565b905083811015620041b857808403600c81116200417857806200417b565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a6086540281620041ad57620041ad62005342565b04608655506200422f565b838103600c8111620041cb5780620041ce565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004207576200420762005342565b04905080608654670de0b6b3a7640000028162004228576200422862005342565b0460865550505b683635c9adc5dea0000060865411156200425657683635c9adc5dea000006086556200426e565b633b9aca0060865410156200426e57633b9aca006086555b5050505050505050565b60068101546001600160401b03600160c01b82048116600160801b90920416111562002e545760068101545f90620042c290600160c01b90046001600160401b031660016200519b565b9050620042d08282620033e7565b15620017df5760068201545f90600290620042fd908490600160801b90046001600160401b03166200529c565b620043099190620054c3565b6200431590836200519b565b9050620043238382620033e7565b156200433557620015fe838262003c0e565b620015fe838362003c0e565b606f5460ff166200436557604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b620043a5828262002263565b620017df57604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052620015fe908490620044f7565b606f5460ff16156200443c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff000000016001600160401b038316108015620044a9575067ffffffff00000001604083901c6001600160401b0316105b8015620044ca575067ffffffff00000001608083901c6001600160401b0316105b8015620044e2575067ffffffff0000000160c083901c105b15620044f057506001919050565b505f919050565b5f6200454d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620045cf9092919063ffffffff16565b805190915015620015fe57808060200190518101906200456e9190620054a2565b620015fe5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000b72565b6060620045df84845f85620045e7565b949350505050565b6060824710156200464a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000b72565b5f80866001600160a01b0316858760405162004667919062005449565b5f6040518083038185875af1925050503d805f8114620046a3576040519150601f19603f3d011682016040523d82523d5f602084013e620046a8565b606091505b509150915062001e028783838760608315620047285782515f0362004720576001600160a01b0385163b620047205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000b72565b5081620045df565b620045df83838151156200473f5781518083602001fd5b8060405162461bcd60e51b815260040162000b72919062004d55565b6108b880620054ec83390190565b6001600160a01b038116811462002e54575f80fd5b80356001600160401b038116811462003495575f80fd5b5f805f805f805f805f806101408b8d031215620047b0575f80fd5b8a35620047bd8162004769565b9950620047cd60208c016200477e565b9850620047dd60408c016200477e565b975060608b0135620047ef8162004769565b965060808b0135620048018162004769565b955060a08b0135620048138162004769565b945060c08b0135620048258162004769565b935060e08b0135620048378162004769565b9250620048486101008c016200477e565b9150620048596101208c016200477e565b90509295989b9194979a5092959850565b6001600160401b0391909116815260200190565b803563ffffffff8116811462003495575f80fd5b5f8060408385031215620048a4575f80fd5b620048af836200487e565b9150620048bf602084016200477e565b90509250929050565b5f805f805f8060c08789031215620048de575f80fd5b8635620048eb8162004769565b9550620048fb602088016200477e565b94506200490b604088016200477e565b935060608701356200491d8162004769565b925060808701356200492f8162004769565b915060a0870135620049418162004769565b809150509295509295509295565b5f6020828403121562004960575f80fd5b62000f81826200487e565b80610300810183101562000f84575f80fd5b5f805f805f805f806103e0898b03121562004996575f80fd5b620049a1896200487e565b9750620049b160208a016200477e565b9650620049c160408a016200477e565b9550620049d160608a016200477e565b9450620049e160808a016200477e565b935060a0890135925060c0890135915062004a008a60e08b016200496b565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562004a28575f80fd5b62004a33896200487e565b975062004a4360208a016200477e565b965062004a5360408a016200477e565b955062004a6360608a016200477e565b94506080890135935060a0890135925060c089013562004a838162004769565b915062004a008a60e08b016200496b565b5f6020828403121562004aa5575f80fd5b813561ffff8116811462004ab7575f80fd5b9392505050565b5f6020828403121562004acf575f80fd5b5035919050565b5f806040838503121562004ae8575f80fd5b82359150602083013562004afc8162004769565b809150509250929050565b5f6020828403121562004b18575f80fd5b62000f81826200477e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004b625762004b6262004b23565b604052919050565b5f82601f83011262004b7a575f80fd5b81356001600160401b0381111562004b965762004b9662004b23565b62004bab601f8201601f191660200162004b37565b81815284602083860101111562004bc0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f805f60e0888a03121562004bf3575f80fd5b62004bfe886200487e565b965062004c0e602089016200477e565b9550604088013562004c208162004769565b9450606088013562004c328162004769565b9350608088013562004c448162004769565b925060a08801356001600160401b038082111562004c60575f80fd5b62004c6e8b838c0162004b6a565b935060c08a013591508082111562004c84575f80fd5b5062004c938a828b0162004b6a565b91505092959891949750929550565b5f805f805f8060c0878903121562004cb8575f80fd5b62004cc3876200487e565b955062004cd3602088016200477e565b945062004ce3604088016200477e565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562004d2057818101518382015260200162004d06565b50505f910152565b5f815180845262004d4181602086016020860162004d04565b601f01601f19169290920160200192915050565b602081525f62000f81602083018462004d28565b5f602080838503121562004d7b575f80fd5b82356001600160401b038082111562004d92575f80fd5b818501915085601f83011262004da6575f80fd5b81358181111562004dbb5762004dbb62004b23565b8060051b915062004dce84830162004b37565b818152918301840191848101908884111562004de8575f80fd5b938501935b8385101562004e085784358252938501939085019062004ded565b98975050505050505050565b5f806040838503121562004e26575f80fd5b62004e31836200477e565b946020939093013593505050565b6001600160a01b0391909116815260200190565b5f805f806060858703121562004e67575f80fd5b843562004e748162004769565b935062004e84602086016200487e565b925060408501356001600160401b038082111562004ea0575f80fd5b818701915087601f83011262004eb4575f80fd5b81358181111562004ec3575f80fd5b88602082850101111562004ed5575f80fd5b95989497505060200194505050565b5f6020828403121562004ef5575f80fd5b813562004ab78162004769565b803560ff8116811462003495575f80fd5b5f805f805f8060c0878903121562004f29575f80fd5b863562004f368162004769565b9550602087013562004f488162004769565b945062004f58604088016200477e565b935062004f68606088016200477e565b92506080870135915062004f7f60a0880162004f02565b90509295509295509295565b5f805f805f8060c0878903121562004fa1575f80fd5b863562004fae8162004769565b9550602087013562004fc08162004769565b945062004fd0604088016200477e565b935062004fe06060880162004f02565b92506080870135915060a08701356001600160401b0381111562005002575f80fd5b6200501089828a0162004b6a565b9150509295509295509295565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b80545f90600181811c90808316806200508557607f831692505b60208084108203620050a557634e487b7160e01b5f52602260045260245ffd5b83885260208801828015620050c35760018114620050da5762005105565b60ff198716825285151560051b8201975062005105565b5f898152602090205f5b87811015620050ff57815484820152908601908401620050e4565b83019850505b5050505050505092915050565b6001600160a01b0386811682528516602082015260a0604082018190525f906200513f908301866200506b565b82810360608401526200515381866200506b565b9150508260808301529695505050505050565b6001600160401b039390931683526020830191909152604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03818116838216019080821115620051be57620051be62005187565b5092915050565b808202811582820484141762000f845762000f8462005187565b5f63ffffffff808316818103620051fa57620051fa62005187565b6001019392505050565b6001600160a01b038481168252831660208201526060604082018190525f90620052319083018462004d28565b95945050505050565b6001600160a01b038781168252868116602083015263ffffffff861660408301528416606082015260c0608082018190525f906200527b9083018562004d28565b82810360a08401526200528f818562004d28565b9998505050505050505050565b6001600160401b03828116828216039080821115620051be57620051be62005187565b5f6001600160401b038281166002600160401b03198101620051fa57620051fa62005187565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000f845762000f8462005187565b5f6001820162005323576200532362005187565b5060010190565b5f602082840312156200533b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8262005367576200536762005342565b500490565b5f826200537d576200537d62005342565b500690565b8181038181111562000f845762000f8462005187565b918252602082015260400190565b5f81620053b757620053b762005187565b505f190190565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b6001600160a01b038781168252861660208201526001600160401b038516604082015260ff841660608201526080810183905260c060a082018190525f9062004e089083018462004d28565b5f82516200545c81846020870162004d04565b9190910192915050565b6103208101610300808584378201835f5b60018110156200549857815183526020928301929091019060010162005477565b5050509392505050565b5f60208284031215620054b3575f80fd5b8151801515811462004ab7575f80fd5b5f6001600160401b0383811680620054df57620054df62005342565b9216919091049291505056fe60a06040526040516108b83803806108b883398101604081905261002291610349565b828161002e8282610056565b50506001600160a01b03821660805261004e61004960805190565b6100b4565b50505061042e565b61005f82610121565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100a8576100a3828261019f565b505050565b6100b0610212565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6100f35f80516020610898833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161011e81610233565b50565b806001600160a01b03163b5f0361015b57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101bb9190610413565b5f60405180830381855af49150503d805f81146101f3576040519150601f19603f3d011682016040523d82523d5f602084013e6101f8565b606091505b509092509050610209858383610270565b95945050505050565b34156102315760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661025c57604051633173bdd160e11b81525f6004820152602401610152565b805f8051602061089883398151915261017e565b60608261028557610280826102cf565b6102c8565b815115801561029c57506001600160a01b0384163b155b156102c557604051639996b31560e01b81526001600160a01b0385166004820152602401610152565b50805b9392505050565b8051156102df5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811461030e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015610341578181015183820152602001610329565b50505f910152565b5f805f6060848603121561035b575f80fd5b610364846102f8565b9250610372602085016102f8565b60408501519092506001600160401b038082111561038e575f80fd5b818601915086601f8301126103a1575f80fd5b8151818111156103b3576103b3610313565b604051601f8201601f19908116603f011681019083821181831017156103db576103db610313565b816040528281528960208487010111156103f3575f80fd5b610404836020830160208801610327565b80955050505050509250925092565b5f8251610424818460208701610327565b9190910192915050565b6080516104536104455f395f601001526104535ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610069575f356001600160e01b03191663278f794360e11b146100615761005f61006d565b565b61005f61007d565b61005f5b61005f6100786100ab565b6100cf565b5f8061008c36600481846102ba565b81019061009991906102f5565b915091506100a782826100ed565b5050565b5f6100ca5f805160206103fe833981519152546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e8080156100e9573d5ff35b3d5ffd5b6100f682610147565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561013f5761013a82826101aa565b505050565b6100a761021c565b806001600160a01b03163b5f0361017c5780604051634c9c8ce360e01b815260040161017391906103bd565b60405180910390fd5b5f805160206103fe83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516101c691906103d1565b5f60405180830381855af49150503d805f81146101fe576040519150601f19603f3d011682016040523d82523d5f602084013e610203565b606091505b509150915061021385838361023b565b95945050505050565b341561005f5760405163b398979f60e01b815260040160405180910390fd5b6060826102505761024b82610291565b61028a565b815115801561026757506001600160a01b0384163b155b156102875783604051639996b31560e01b815260040161017391906103bd565b50805b9392505050565b8051156102a15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f80858511156102c8575f80fd5b838611156102d4575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f8060408385031215610306575f80fd5b82356001600160a01b038116811461031c575f80fd5b915060208301356001600160401b0380821115610337575f80fd5b818501915085601f83011261034a575f80fd5b81358181111561035c5761035c6102e1565b604051601f8201601f19908116603f01168101908382118183101715610384576103846102e1565b8160405282815288602084870101111561039c575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b6001600160a01b0391909116815260200190565b5f82515f5b818110156103f057602081860181015185830152016103d6565b505f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220d3b91b386436af95579d7d767b3c6e83ae79b09bd8dd9344bddb95185404c56564736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610373cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f066156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fbab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bdac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f430644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024983dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68ea5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db19b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545ea0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4a26469706673582212200ce6fcb9a490f6b26945426ab051c2a0bf7369618afe91f355793beb03787e1964736f6c63430008140033",
+ "bytecode": "0x60e060405234801562000010575f80fd5b50604051620059833803806200598383398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c05161579a620001e95f395f818161097501528181612338015261342e01525f818161080601528181612dd101526134fa01525f81816108b801528181610ec3015281816119cc0152611b14015261579a5ff3fe608060405234801562000010575f80fd5b50600436106200035c575f3560e01c80638875f03c11620001cb578063c1acbc341162000107578063d890581211620000ab578063dfdb8c5e1162000083578063dfdb8c5e1462000958578063e46761c4146200096f578063f4e926751462000997578063f9c4c2ae14620009a8575f80fd5b8063d89058121462000908578063dbc169761462000933578063dde0ff77146200093d575f80fd5b8063d02103ca11620000df578063d02103ca14620008b2578063d5073f6f14620008da578063d547741f14620008f1575f80fd5b8063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a575f80fd5b80639a908e73116200016f578063a2967d991162000147578063a2967d9914620007f6578063a3c573eb1462000800578063abcb51981462000841575f80fd5b80639a908e7314620007c05780639e36c56514620007d7578063a217fddf14620007ee575f80fd5b806391d1485411620001a357806391d14854146200076457806397bf07e8146200079f57806399f5634e14620007b6575f80fd5b80638875f03c146200071f5780638f698ec514620007365780638fd88cc2146200074d575f80fd5b8063477fa270116200029b5780637222020f116200023f5780637975fcfe11620002175780637975fcfe14620006c75780637fb6e76a14620006ed5780638129fc1c1462000715575f80fd5b80637222020f1462000673578063727885e9146200068a57806374d9c24414620006a1575f80fd5b806362d87e66116200027357806362d87e6614620005a857806365c0504d14620005bf578063680658a1146200063f575f80fd5b8063477fa270146200055257806355a71ee0146200055b57806360469169146200059e575f80fd5b80632072f6c511620003035780632f2ff15d11620002db5780632f2ff15d146200051057806330c27dde146200052757806336568abe146200053b575f80fd5b80632072f6c5146200041e578063248a9ca3146200042857806325280169146200045c575f80fd5b80631489ed1011620003375780631489ed1014620003c157806315064c9614620003d85780631796a1ae14620003f7575f80fd5b8063066ec01214620003605780630e36f582146200039157806311f6b28714620003aa575b5f80fd5b60845462000374906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003a8620003a236600462003fb1565b620009ce565b005b62000374620003bb3660046200404c565b62000d8a565b620003a8620003d23660046200406f565b62000db9565b606f54620003e69060ff1681565b604051901515815260200162000388565b607e54620004089063ffffffff1681565b60405163ffffffff909116815260200162000388565b620003a862000fa9565b6200044d6200043936600462004109565b5f9081526034602052604090206001015490565b60405190815260200162000388565b620004dc6200046d36600462004121565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000388565b620003a86200052136600462004157565b62001085565b60875462000374906001600160401b031681565b620003a86200054c36600462004157565b620010b2565b6086546200044d565b6200044d6200056c36600462004121565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200044d620010ec565b620003e6620005b936600462004109565b62001103565b6200062a620005d03660046200404c565b607f6020525f908152604090208054600182015460028301546003909301546001600160a01b0392831693928216926001600160401b03600160a01b8404169260ff600160e01b8204811693600160e81b90920416919087565b604051620003889796959493929190620041bd565b620003a86200065036600462004211565b63ffffffff9092165f908152608160205260409020600581019190915560080155565b620003a8620006843660046200404c565b6200110f565b620003a86200069b36600462004306565b62001205565b620006b8620006b23660046200404c565b62001693565b604051620003889190620043cc565b620006de620006d8366004620044d8565b620017c5565b6040516200038891906200458b565b62000408620006fe3660046200459f565b60836020525f908152604090205463ffffffff1681565b620003a8620017f7565b620003a862000730366004620045bb565b6200192b565b620003a86200074736600462004661565b62001be1565b620003a86200075e3660046200470c565b62001c65565b620003e66200077536600462004157565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b620003a8620007b03660046200473a565b62001fff565b6200044d62002317565b62000374620007d1366004620047bc565b620023f8565b620006de620007e8366004620047e7565b620025f9565b6200044d5f81565b6200044d6200262b565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000388565b620003a86200085236600462004820565b620029f3565b6084546200037490600160801b90046001600160401b031681565b620003a862000884366004620048bc565b62002c6e565b620004086200089b36600462004933565b60826020525f908152604090205463ffffffff1681565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b620003a8620008eb36600462004109565b62002cad565b620003a86200090236600462004157565b62002d4f565b620006de6040518060400160405280600b81526020016a70657373696d697374696360a81b81525081565b620003a862002d77565b6084546200037490600160401b90046001600160401b031681565b620003a86200096936600462004951565b62002e43565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b608054620004089063ffffffff1681565b620009bf620009b93660046200404c565b62002f93565b60405162000388919062004980565b5f54600290610100900460ff16158015620009ef57505f5460ff8083169116105b62000a585760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461ffff191660ff83161761010017905567016345785d8a000060865562000a81620030f3565b62000aad7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4886200315f565b62000ab95f846200315f565b62000ae57fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590846200315f565b62000b117f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e846200315f565b62000b3d7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac846200315f565b62000b697fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd856200315f565b62000b957fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08856200315f565b62000bc17f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4856200315f565b62000bed7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1856200315f565b62000c397f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f06200316b565b62000c657f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0856200315f565b62000c917f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb856200315f565b62000cdd7f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859516200316b565b62000d097f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e836200315f565b62000d357f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951836200315f565b62000d415f336200315f565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812060060154600160401b90046001600160401b03165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462000de581620031b5565b6001600160401b0388161562000e0e5760405163306dfc5760e11b815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154600160801b900460ff16600181111562000e465762000e4662004188565b1462000e65576040516390db0d0760e01b815260040160405180910390fd5b62000e7681898989898989620031c1565b6006810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038a16908102919091179091555f9081526002820160205260409020859055600581018690557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000efa6200262b565b6040518263ffffffff1660e01b815260040162000f1991815260200190565b5f604051808303815f87803b15801562000f31575f80fd5b505af115801562000f44573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200107957608454600160801b90046001600160401b031615806200102a575060845442906200101f9062093a8090600160801b90046001600160401b031662004aa9565b6001600160401b0316115b806200105a575060875442906200104f9062093a80906001600160401b031662004aa9565b6001600160401b0316115b15620010795760405163692baaad60e11b815260040160405180910390fd5b62001083620034f8565b565b5f82815260346020526040902060010154620010a181620031b5565b620010ad838362003572565b505050565b6001600160a01b0381163314620010dc57604051630b4ad1cd60e31b815260040160405180910390fd5b620010e88282620035f6565b5050565b5f6086546064620010fe919062004ad3565b905090565b5f62000db38262003678565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200113b81620031b5565b63ffffffff821615806200115a5750607e5463ffffffff908116908316115b156200117957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001810154600160e81b900460ff1615620011bb57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200123181620031b5565b63ffffffff88161580620012505750607e5463ffffffff908116908916115b156200126f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001810154600160e81b900460ff1615620012b157604051633b8d3d9960e01b815260040160405180910390fd5b63ffffffff6001600160401b0389161115620012e057604051634c753f5760e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff16156200131d576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620013379063ffffffff1662004aed565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620013849062003f77565b620013929392919062004b12565b604051809103905ff080158015620013ac573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff02191690836001811115620015ac57620015ac62004188565b0217905550600384015460098201556040805163ffffffff8e811682526001600160a01b0385811660208401526001600160401b038f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a2604051633892b81160e11b81526001600160a01b0383169063712570229062001656908d908d9088908e908e908e9060040162004b3f565b5f604051808303815f87803b1580156200166e575f80fd5b505af115801562001681573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a90982080546001600160a01b038082168c52600160a01b918290046001600160401b0390811690995260018084015491821690985204871690945260058401549092526006830154808616909152600160401b9081900485169091526007820154808516909652850490921690955292939091600160801b900460ff169081111562001792576200179262004188565b90816001811115620017a857620017a862004188565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f908152608160205260409020606090620017ec90878787878762003701565b979650505050505050565b5f54600390610100900460ff161580156200181857505f5460ff8083169116105b6200187d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000a4f565b5f805461ffff191660ff831617610100179055604080518082018252600b81526a70657373696d697374696360a81b602082015290517f50cadc0c001f05dd4b81db1e92b98d77e718fd2f103fb7b77293e867d329a4c291620018e0916200458b565b60405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd46200195781620031b5565b63ffffffff87165f90815260816020526040902060016007820154600160801b900460ff16600181111562001990576200199062004188565b14620019af57604051633a64d97360e01b815260040160405180910390fd5b60405163ef4eeb3560e01b815263ffffffff881660048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ef4eeb3590602401602060405180830381865afa15801562001a1a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a40919062004ba1565b90508062001a615760405163a60721e160e01b815260040160405180910390fd5b5f62001a718a84848b8b62003858565b6001840154600985015460405163020a49e360e51b81529293506001600160a01b03909116916341493c609162001ab19185908b908b9060040162004bb9565b5f6040518083038186803b15801562001ac8575f80fd5b505afa15801562001adb573d5f803e3d5ffd5b50506084805467ffffffffffffffff60801b1916600160801b426001600160401b031602179055505060058301889055600883018790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001b4b6200262b565b6040518263ffffffff1660e01b815260040162001b6a91815260200190565b5f604051808303815f87803b15801562001b82575f80fd5b505af115801562001b95573d5f803e3d5ffd5b5050604080515f80825260208201529081018b905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600162000f95565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620010e85781818151811062001c1d5762001c1d62004c06565b602002602001015160815f83600162001c37919062004c1a565b63ffffffff16815260208101919091526040015f20600501558062001c5c8162004c30565b91505062001bfe565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff1615801562001d185750336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001ce6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001d0c919062004c4b565b6001600160a01b031614155b1562001d3757604051630d03687f60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526082602052604081205463ffffffff169081900362001d77576040516374a086a360e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff16600181111562001daf5762001daf62004188565b1462001dce576040516390db0d0760e01b815260040160405180910390fd5b60068101546001600160401b039081169084168111158062001e07575060068201546001600160401b03600160401b9091048116908516105b1562001e265760405163cb23ebdf60e01b815260040160405180910390fd5b805b846001600160401b0316816001600160401b03161462001eca576001600160401b038082165f908152600385016020526040902060010154600160401b9004811690861681101562001e8d57604051639753965f60e01b815260040160405180910390fd5b6001600160401b039091165f908152600384016020526040812090815560010180546fffffffffffffffffffffffffffffffff1916905562001e28565b60068301805467ffffffffffffffff19166001600160401b03871617905562001ef4858362004c69565b608480545f9062001f109084906001600160401b031662004c69565b82546101009290920a6001600160401b0381810219909316918316021790915586165f8181526003860160205260409081902054905163334d6f6760e11b8152600481019290925260248201526001600160a01b038816915063669adece906044015f604051808303815f87803b15801562001f8a575f80fd5b505af115801562001f9d573d5f803e3d5ffd5b505050506001600160401b0385165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200202b81620031b5565b6001600160401b0385165f9081526083602052604090205463ffffffff161562002068576040516337c8fe0960e11b815260040160405180910390fd5b63ffffffff6001600160401b03861611156200209757604051634c753f5760e01b815260040160405180910390fd5b6001600160a01b0388165f9081526082602052604090205463ffffffff1615620020d457604051630d409b9360e41b815260040160405180910390fd5b608080545f91908290620020ee9063ffffffff1662004aed565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f886001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550878160010160146101000a8154816001600160401b0302191690836001600160401b0316021790555088816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555086815f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550848160070160106101000a81548160ff0219169083600181111562002278576200227862004188565b0217905550600185600181111562002294576200229462004188565b03620022ae576009810184905560058101869055620022c1565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a604051620023039695949392919062004c8c565b60405180910390a250505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156200237e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023a4919062004ba1565b6084549091505f90620023ca906001600160401b03600160401b82048116911662004c69565b6001600160401b03169050805f03620023e5575f9250505090565b620023f1818362004ced565b9250505090565b606f545f9060ff16156200241f57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362002456576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200248057604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff166001811115620024b857620024b862004188565b14620024d7576040516390db0d0760e01b815260040160405180910390fd5b608480548691905f90620024f69084906001600160401b031662004aa9565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200252b878362004aa9565b6006840180546001600160401b0383811667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c018352859020935184559151600193909301805492518716600160401b026fffffffffffffffffffffffffffffffff199093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200262090869086868662003858565b90505b949350505050565b6080545f9063ffffffff168082036200264557505f919050565b5f816001600160401b0381111562002661576200266162004244565b6040519080825280602002602001820160405280156200268b578160200160208202803683370190505b5090505f5b82811015620026fb5760815f620026a983600162004c1a565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620026db57620026db62004c06565b602090810291909101015280620026f28162004c30565b91505062002690565b505f60205b8360011462002953575f6200271760028662004d03565b6200272460028762004ced565b62002730919062004c1a565b90505f816001600160401b038111156200274e576200274e62004244565b60405190808252806020026020018201604052801562002778578160200160208202803683370190505b5090505f5b82811015620028ff576200279360018462004d19565b81148015620027ae5750620027aa60028862004d03565b6001145b15620028365785620027c282600262004ad3565b81518110620027d557620027d562004c06565b602002602001015185604051602001620027f9929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002824576200282462004c06565b602002602001018181525050620028ea565b856200284482600262004ad3565b8151811062002857576200285762004c06565b6020026020010151868260026200286f919062004ad3565b6200287c90600162004c1a565b815181106200288f576200288f62004c06565b6020026020010151604051602001620028b2929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028dd57620028dd62004c06565b6020026020010181815250505b80620028f68162004c30565b9150506200277d565b50809450819550838460405160200162002923929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029489062004d2f565b935050505062002700565b5f835f8151811062002969576200296962004c06565b602002602001015190505f5b82811015620029e957604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620029e09062004c30565b91505062002975565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002a1f81620031b5565b607e80545f9190829062002a399063ffffffff1662004aed565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060018081111562002a6d5762002a6d62004188565b86600181111562002a825762002a8262004188565b0362002aae57841562002aa8576040516363d722e760e01b815260040160405180910390fd5b62002ace565b821562002ace576040516363d722e760e01b815260040160405180910390fd5b6040518060e001604052808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b0316815260200187600181111562002b1b5762002b1b62004188565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f825291829020845181546001600160a01b0391821673ffffffffffffffffffffffffffffffffffffffff199091161782559185015160018281018054958801516001600160401b0316600160a01b026001600160e01b0319909616929094169190911793909317808355938501519093909260ff60e01b1990911690600160e01b90849081111562002bd75762002bd762004188565b02179055506080820151600182018054911515600160e81b0260ff60e81b1990921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002c5b908c908c908c908c908c908c908c9062004d47565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002c9a81620031b5565b62002ca78484846200393d565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002cd981620031b5565b683635c9adc5dea0000082118062002cf45750633b9aca0082105b1562002d1357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f8281526034602052604090206001015462002d6b81620031b5565b620010ad8383620035f6565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002da381620031b5565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e1f575f80fd5b505af115801562002e32573d5f803e3d5ffd5b5050505062002e4062003c23565b50565b336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002e8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002eb0919062004c4b565b6001600160a01b03161462002ed85760405163696072e960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526082602090815260408083205463ffffffff1683526081909152902060068101546001600160401b03808216600160401b909204161462002f3a5760405163664316a560e11b815260040160405180910390fd5b600781015463ffffffff8316600160401b9091046001600160401b03161062002f7657604051633e37e23360e01b815260040160405180910390fd5b604080515f815260208101909152620010ad90849084906200393d565b62002ff860408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f9081526081602090815260409182902080546001600160a01b038082168652600160a01b918290046001600160401b039081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a0860152600160401b808204841660c0870152600160801b808304851660e0880152600160c01b9092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff1690811115620030d357620030d362004188565b90816001811115620030e957620030e962004188565b8152505050919050565b5f54610100900460ff16620010835760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000a4f565b620010e8828262003572565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b62002e40813362003c7b565b5f80620031e089600601546001600160401b03600160401b9091041690565b60078a01549091506001600160401b039081169089161015620032165760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388165f90815260028a01602052604090205491508162003251576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200328557604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032b85760405163b9b18f5760e01b815260040160405180910390fd5b5f620032c98a8a8a8a878b62003701565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032ff919062004daa565b602060405180830381855afa1580156200331b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003340919062004ba1565b6200334c919062004d03565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033909189919060040162004dc7565b602060405180830381865afa158015620033ac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033d2919062004e03565b620033f0576040516309bde33960e01b815260040160405180910390fd5b5f620033fd848b62004c69565b90506200345687826001600160401b03166200341862002317565b62003424919062004ad3565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003cbe565b80608460088282829054906101000a90046001600160401b03166200347c919062004aa9565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558d546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162001656565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003551575f80fd5b505af115801562003564573d5f803e3d5ffd5b505050506200108362003d27565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff16620010e8575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1615620010e8575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f67ffffffff000000016001600160401b038316108015620036ae575067ffffffff00000001604083901c6001600160401b0316105b8015620036cf575067ffffffff00000001608083901c6001600160401b0316105b8015620036e7575067ffffffff0000000160c083901c105b15620036f557506001919050565b505f919050565b919050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003736575081155b15620037555760405163340c614f60e11b815260040160405180910390fd5b8062003774576040516366385b5160e01b815260040160405180910390fd5b6200377f8462003678565b6200379d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a90046001600160a01b03166001600160a01b031663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa158015620038ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620038d3919062004ba1565b60058701546008880154604080516020810193909352820152606081018790526001600160e01b031960e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff821615806200395c5750607e5463ffffffff908116908316115b156200397b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526082602052604081205463ffffffff1690819003620039bb576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918516600160401b9091046001600160401b03160362003a0957604051634f61d51960e01b815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001810154600160e81b900460ff161562003a4b57604051633b8d3d9960e01b815260040160405180910390fd5b600181810154600160e01b900460ff169081111562003a6e5762003a6e62004188565b6007830154600160801b900460ff16600181111562003a915762003a9162004188565b1462003ab057604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b031990921690921717905560038101546009830155600782018054600160401b63ffffffff8816026fffffffffffffffff0000000000000000199091161790555f62003b4c8462000d8a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b0389811692634f1ef2869262003ba0921690899060040162004e24565b5f604051808303815f87803b15801562003bb8575f80fd5b505af115801562003bcb573d5f803e3d5ffd5b50506040805163ffffffff8a811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff1662003c4757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff16620010e857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052620010ad90849062003d83565b606f5460ff161562003d4c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f62003dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662003e5b9092919063ffffffff16565b805190915015620010ad578080602001905181019062003dfa919062004e03565b620010ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000a4f565b60606200262384845f85855f80866001600160a01b0316858760405162003e83919062004daa565b5f6040518083038185875af1925050503d805f811462003ebf576040519150601f19603f3d011682016040523d82523d5f602084013e62003ec4565b606091505b5091509150620017ec878383876060831562003f445782515f0362003f3c576001600160a01b0385163b62003f3c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000a4f565b508162002623565b62002623838381511562003f5b5781518083602001fd5b8060405162461bcd60e51b815260040162000a4f91906200458b565b61091d8062004e4883390190565b6001600160a01b038116811462002e40575f80fd5b80356001600160401b0381168114620036fc575f80fd5b5f805f805f8060c0878903121562003fc7575f80fd5b863562003fd48162003f85565b955062003fe46020880162003f9a565b945062003ff46040880162003f9a565b93506060870135620040068162003f85565b92506080870135620040188162003f85565b915060a08701356200402a8162003f85565b809150509295509295509295565b803563ffffffff81168114620036fc575f80fd5b5f602082840312156200405d575f80fd5b620040688262004038565b9392505050565b5f805f805f805f806103e0808a8c03121562004089575f80fd5b620040948a62004038565b9850620040a460208b0162003f9a565b9750620040b460408b0162003f9a565b9650620040c460608b0162003f9a565b955060808a0135945060a08a0135935060c08a0135620040e48162003f85565b92508981018b1015620040f5575f80fd5b5060e0890190509295985092959890939650565b5f602082840312156200411a575f80fd5b5035919050565b5f806040838503121562004133575f80fd5b6200413e8362004038565b91506200414e6020840162003f9a565b90509250929050565b5f806040838503121562004169575f80fd5b8235915060208301356200417d8162003f85565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60028110620041b957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b038881168252871660208201526001600160401b038616604082015260e08101620041f360608301876200419c565b931515608082015260a081019290925260c090910152949350505050565b5f805f6060848603121562004224575f80fd5b6200422f8462004038565b95602085013595506040909401359392505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004283576200428362004244565b604052919050565b5f6001600160401b03831115620042a657620042a662004244565b620042bb601f8401601f191660200162004258565b9050828152838383011115620042cf575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112620042f5575f80fd5b62004068838335602085016200428b565b5f805f805f805f60e0888a0312156200431d575f80fd5b620043288862004038565b9650620043386020890162003f9a565b955060408801356200434a8162003f85565b945060608801356200435c8162003f85565b935060808801356200436e8162003f85565b925060a08801356001600160401b03808211156200438a575f80fd5b620043988b838c01620042e5565b935060c08a0135915080821115620043ae575f80fd5b50620043bd8a828b01620042e5565b91505092959891949750929550565b81516001600160a01b0316815261018081016020830151620043f960208401826001600160401b03169052565b5060408301516200441560408401826001600160a01b03169052565b5060608301516200443160608401826001600160401b03169052565b506080830151608083015260a08301516200445760a08401826001600160401b03169052565b5060c08301516200447360c08401826001600160401b03169052565b5060e08301516200448f60e08401826001600160401b03169052565b50610100838101516001600160401b03169083015261012080840151620044b9828501826200419c565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c08789031215620044ee575f80fd5b620044f98762004038565b9550620045096020880162003f9a565b9450620045196040880162003f9a565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620045565781810151838201526020016200453c565b50505f910152565b5f8151808452620045778160208601602086016200453a565b601f01601f19169290920160200192915050565b602081525f6200406860208301846200455e565b5f60208284031215620045b0575f80fd5b620040688262003f9a565b5f805f805f8060a08789031215620045d1575f80fd5b620045dc8762004038565b9550620045ec6020880162004038565b9450604087013593506060870135925060808701356001600160401b038082111562004616575f80fd5b818901915089601f8301126200462a575f80fd5b81358181111562004639575f80fd5b8a60208285010111156200464b575f80fd5b6020830194508093505050509295509295509295565b5f602080838503121562004673575f80fd5b82356001600160401b03808211156200468a575f80fd5b818501915085601f8301126200469e575f80fd5b813581811115620046b357620046b362004244565b8060051b9150620046c684830162004258565b8181529183018401918481019088841115620046e0575f80fd5b938501935b838510156200470057843582529385019390850190620046e5565b98975050505050505050565b5f80604083850312156200471e575f80fd5b82356200413e8162003f85565b803560028110620036fc575f80fd5b5f805f805f805f60e0888a03121562004751575f80fd5b87356200475e8162003f85565b96506020880135620047708162003f85565b9550620047806040890162003f9a565b9450620047906060890162003f9a565b935060808801359250620047a760a089016200472b565b915060c0880135905092959891949750929550565b5f8060408385031215620047ce575f80fd5b620047d98362003f9a565b946020939093013593505050565b5f805f8060808587031215620047fb575f80fd5b620048068562004038565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a03121562004837575f80fd5b8735620048448162003f85565b96506020880135620048568162003f85565b9550620048666040890162003f9a565b945062004876606089016200472b565b93506080880135925060a08801356001600160401b0381111562004898575f80fd5b620048a68a828b01620042e5565b92505060c0880135905092959891949750929550565b5f805f60608486031215620048cf575f80fd5b8335620048dc8162003f85565b9250620048ec6020850162004038565b915060408401356001600160401b0381111562004907575f80fd5b8401601f8101861362004918575f80fd5b62004929868235602084016200428b565b9150509250925092565b5f6020828403121562004944575f80fd5b8135620040688162003f85565b5f806040838503121562004963575f80fd5b8235620049708162003f85565b91506200414e6020840162004038565b81516001600160a01b0316815261018081016020830151620049ad60208401826001600160401b03169052565b506040830151620049c960408401826001600160a01b03169052565b506060830151620049e560608401826001600160401b03169052565b506080830151608083015260a083015162004a0b60a08401826001600160401b03169052565b5060c083015162004a2760c08401826001600160401b03169052565b5060e083015162004a4360e08401826001600160401b03169052565b50610100838101516001600160401b03908116918401919091526101208085015182169084015261014080850151909116908301526101608084015162004a8d828501826200419c565b505092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004acc5762004acc62004a95565b5092915050565b808202811582820484141762000db35762000db362004a95565b5f63ffffffff80831681810362004b085762004b0862004a95565b6001019392505050565b5f6001600160a01b038086168352808516602084015250606060408301526200262060608301846200455e565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c0608083015262004b8060c08301856200455e565b82810360a084015262004b9481856200455e565b9998505050505050505050565b5f6020828403121562004bb2575f80fd5b5051919050565b848152606060208201525f62004bd360608301866200455e565b8281036040840152838152838560208301375f602085830101526020601f19601f86011682010191505095945050505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000db35762000db362004a95565b5f6001820162004c445762004c4462004a95565b5060010190565b5f6020828403121562004c5c575f80fd5b8151620040688162003f85565b6001600160401b0382811682821603908082111562004acc5762004acc62004a95565b6001600160401b0387811682526001600160a01b0387166020830152858116604083015260c082019062004cc460608401876200419c565b93909316608082015260a00152949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cfe5762004cfe62004cd9565b500490565b5f8262004d145762004d1462004cd9565b500690565b8181038181111562000db35762000db362004a95565b5f8162004d405762004d4062004a95565b505f190190565b6001600160a01b038881168252871660208201526001600160401b03861660408201525f62004d7a60608301876200419c565b84608083015260e060a083015262004d9660e08301856200455e565b90508260c083015298975050505050505050565b5f825162004dbd8184602087016200453a565b9190910192915050565b6103208101610300808584378201835f5b600181101562004df957815183526020928301929091019060010162004dd8565b5050509392505050565b5f6020828403121562004e14575f80fd5b8151801515811462004068575f80fd5b6001600160a01b0383168152604060208201525f6200262360408301846200455e56fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212200ba7709ac5122ac8329e53f4c86801ef6b95d32e3af0d4683702b6e1064e468764736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200035c575f3560e01c80638875f03c11620001cb578063c1acbc341162000107578063d890581211620000ab578063dfdb8c5e1162000083578063dfdb8c5e1462000958578063e46761c4146200096f578063f4e926751462000997578063f9c4c2ae14620009a8575f80fd5b8063d89058121462000908578063dbc169761462000933578063dde0ff77146200093d575f80fd5b8063d02103ca11620000df578063d02103ca14620008b2578063d5073f6f14620008da578063d547741f14620008f1575f80fd5b8063c1acbc341462000858578063c4c928c21462000873578063ceee281d146200088a575f80fd5b80639a908e73116200016f578063a2967d991162000147578063a2967d9914620007f6578063a3c573eb1462000800578063abcb51981462000841575f80fd5b80639a908e7314620007c05780639e36c56514620007d7578063a217fddf14620007ee575f80fd5b806391d1485411620001a357806391d14854146200076457806397bf07e8146200079f57806399f5634e14620007b6575f80fd5b80638875f03c146200071f5780638f698ec514620007365780638fd88cc2146200074d575f80fd5b8063477fa270116200029b5780637222020f116200023f5780637975fcfe11620002175780637975fcfe14620006c75780637fb6e76a14620006ed5780638129fc1c1462000715575f80fd5b80637222020f1462000673578063727885e9146200068a57806374d9c24414620006a1575f80fd5b806362d87e66116200027357806362d87e6614620005a857806365c0504d14620005bf578063680658a1146200063f575f80fd5b8063477fa270146200055257806355a71ee0146200055b57806360469169146200059e575f80fd5b80632072f6c511620003035780632f2ff15d11620002db5780632f2ff15d146200051057806330c27dde146200052757806336568abe146200053b575f80fd5b80632072f6c5146200041e578063248a9ca3146200042857806325280169146200045c575f80fd5b80631489ed1011620003375780631489ed1014620003c157806315064c9614620003d85780631796a1ae14620003f7575f80fd5b8063066ec01214620003605780630e36f582146200039157806311f6b28714620003aa575b5f80fd5b60845462000374906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b620003a8620003a236600462003fb1565b620009ce565b005b62000374620003bb3660046200404c565b62000d8a565b620003a8620003d23660046200406f565b62000db9565b606f54620003e69060ff1681565b604051901515815260200162000388565b607e54620004089063ffffffff1681565b60405163ffffffff909116815260200162000388565b620003a862000fa9565b6200044d6200043936600462004109565b5f9081526034602052604090206001015490565b60405190815260200162000388565b620004dc6200046d36600462004121565b60408051606080820183525f808352602080840182905292840181905263ffffffff959095168552608182528285206001600160401b03948516865260030182529382902082519485018352805485526001015480841691850191909152600160401b90049091169082015290565b60408051825181526020808401516001600160401b0390811691830191909152928201519092169082015260600162000388565b620003a86200052136600462004157565b62001085565b60875462000374906001600160401b031681565b620003a86200054c36600462004157565b620010b2565b6086546200044d565b6200044d6200056c36600462004121565b63ffffffff82165f9081526081602090815260408083206001600160401b038516845260020190915290205492915050565b6200044d620010ec565b620003e6620005b936600462004109565b62001103565b6200062a620005d03660046200404c565b607f6020525f908152604090208054600182015460028301546003909301546001600160a01b0392831693928216926001600160401b03600160a01b8404169260ff600160e01b8204811693600160e81b90920416919087565b604051620003889796959493929190620041bd565b620003a86200065036600462004211565b63ffffffff9092165f908152608160205260409020600581019190915560080155565b620003a8620006843660046200404c565b6200110f565b620003a86200069b36600462004306565b62001205565b620006b8620006b23660046200404c565b62001693565b604051620003889190620043cc565b620006de620006d8366004620044d8565b620017c5565b6040516200038891906200458b565b62000408620006fe3660046200459f565b60836020525f908152604090205463ffffffff1681565b620003a8620017f7565b620003a862000730366004620045bb565b6200192b565b620003a86200074736600462004661565b62001be1565b620003a86200075e3660046200470c565b62001c65565b620003e66200077536600462004157565b5f9182526034602090815260408084206001600160a01b0393909316845291905290205460ff1690565b620003a8620007b03660046200473a565b62001fff565b6200044d62002317565b62000374620007d1366004620047bc565b620023f8565b620006de620007e8366004620047e7565b620025f9565b6200044d5f81565b6200044d6200262b565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200162000388565b620003a86200085236600462004820565b620029f3565b6084546200037490600160801b90046001600160401b031681565b620003a862000884366004620048bc565b62002c6e565b620004086200089b36600462004933565b60826020525f908152604090205463ffffffff1681565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b620003a8620008eb36600462004109565b62002cad565b620003a86200090236600462004157565b62002d4f565b620006de6040518060400160405280600b81526020016a70657373696d697374696360a81b81525081565b620003a862002d77565b6084546200037490600160401b90046001600160401b031681565b620003a86200096936600462004951565b62002e43565b620008287f000000000000000000000000000000000000000000000000000000000000000081565b608054620004089063ffffffff1681565b620009bf620009b93660046200404c565b62002f93565b60405162000388919062004980565b5f54600290610100900460ff16158015620009ef57505f5460ff8083169116105b62000a585760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805461ffff191660ff83161761010017905567016345785d8a000060865562000a81620030f3565b62000aad7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4886200315f565b62000ab95f846200315f565b62000ae57fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590846200315f565b62000b117f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e846200315f565b62000b3d7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac846200315f565b62000b697fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd856200315f565b62000b957fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd08856200315f565b62000bc17f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4856200315f565b62000bed7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1856200315f565b62000c397f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f06200316b565b62000c657f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0856200315f565b62000c917f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb856200315f565b62000cdd7f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859516200316b565b62000d097f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e836200315f565b62000d357f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951836200315f565b62000d415f336200315f565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b63ffffffff81165f90815260816020526040812060060154600160401b90046001600160401b03165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462000de581620031b5565b6001600160401b0388161562000e0e5760405163306dfc5760e11b815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154600160801b900460ff16600181111562000e465762000e4662004188565b1462000e65576040516390db0d0760e01b815260040160405180910390fd5b62000e7681898989898989620031c1565b6006810180546fffffffffffffffff00000000000000001916600160401b6001600160401b038a16908102919091179091555f9081526002820160205260409020859055600581018690557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62000efa6200262b565b6040518263ffffffff1660e01b815260040162000f1991815260200190565b5f604051808303815f87803b15801562000f31575f80fd5b505af115801562000f44573d5f803e3d5ffd5b5050604080516001600160401b038b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200107957608454600160801b90046001600160401b031615806200102a575060845442906200101f9062093a8090600160801b90046001600160401b031662004aa9565b6001600160401b0316115b806200105a575060875442906200104f9062093a80906001600160401b031662004aa9565b6001600160401b0316115b15620010795760405163692baaad60e11b815260040160405180910390fd5b62001083620034f8565b565b5f82815260346020526040902060010154620010a181620031b5565b620010ad838362003572565b505050565b6001600160a01b0381163314620010dc57604051630b4ad1cd60e31b815260040160405180910390fd5b620010e88282620035f6565b5050565b5f6086546064620010fe919062004ad3565b905090565b5f62000db38262003678565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd6200113b81620031b5565b63ffffffff821615806200115a5750607e5463ffffffff908116908316115b156200117957604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001810154600160e81b900460ff1615620011bb57604051633b8d3d9960e01b815260040160405180910390fd5b60018101805460ff60e81b1916600160e81b17905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200123181620031b5565b63ffffffff88161580620012505750607e5463ffffffff908116908916115b156200126f57604051637512e5cb60e01b815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001810154600160e81b900460ff1615620012b157604051633b8d3d9960e01b815260040160405180910390fd5b63ffffffff6001600160401b0389161115620012e057604051634c753f5760e01b815260040160405180910390fd5b6001600160401b0388165f9081526083602052604090205463ffffffff16156200131d576040516337c8fe0960e11b815260040160405180910390fd5b608080545f91908290620013379063ffffffff1662004aed565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f80825260208201928390529394506001600160a01b03909216913091620013849062003f77565b620013929392919062004b12565b604051809103905ff080158015620013ac573d5f803e3d5ffd5b5090508160835f8c6001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f836001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508360010160149054906101000a90046001600160401b03168160010160146101000a8154816001600160401b0302191690836001600160401b03160217905550836001015f9054906101000a90046001600160a01b0316816001015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a815f0160146101000a8154816001600160401b0302191690836001600160401b031602179055508360020154816002015f806001600160401b031681526020019081526020015f20819055508b63ffffffff168160070160086101000a8154816001600160401b0302191690836001600160401b0316021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff02191690836001811115620015ac57620015ac62004188565b0217905550600384015460098201556040805163ffffffff8e811682526001600160a01b0385811660208401526001600160401b038f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a2604051633892b81160e11b81526001600160a01b0383169063712570229062001656908d908d9088908e908e908e9060040162004b3f565b5f604051808303815f87803b1580156200166e575f80fd5b505af115801562001681573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a90982080546001600160a01b038082168c52600160a01b918290046001600160401b0390811690995260018084015491821690985204871690945260058401549092526006830154808616909152600160401b9081900485169091526007820154808516909652850490921690955292939091600160801b900460ff169081111562001792576200179262004188565b90816001811115620017a857620017a862004188565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f908152608160205260409020606090620017ec90878787878762003701565b979650505050505050565b5f54600390610100900460ff161580156200181857505f5460ff8083169116105b6200187d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000a4f565b5f805461ffff191660ff831617610100179055604080518082018252600b81526a70657373696d697374696360a81b602082015290517f50cadc0c001f05dd4b81db1e92b98d77e718fd2f103fb7b77293e867d329a4c291620018e0916200458b565b60405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd46200195781620031b5565b63ffffffff87165f90815260816020526040902060016007820154600160801b900460ff16600181111562001990576200199062004188565b14620019af57604051633a64d97360e01b815260040160405180910390fd5b60405163ef4eeb3560e01b815263ffffffff881660048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ef4eeb3590602401602060405180830381865afa15801562001a1a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a40919062004ba1565b90508062001a615760405163a60721e160e01b815260040160405180910390fd5b5f62001a718a84848b8b62003858565b6001840154600985015460405163020a49e360e51b81529293506001600160a01b03909116916341493c609162001ab19185908b908b9060040162004bb9565b5f6040518083038186803b15801562001ac8575f80fd5b505afa15801562001adb573d5f803e3d5ffd5b50506084805467ffffffffffffffff60801b1916600160801b426001600160401b031602179055505060058301889055600883018790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d62001b4b6200262b565b6040518263ffffffff1660e01b815260040162001b6a91815260200190565b5f604051808303815f87803b15801562001b82575f80fd5b505af115801562001b95573d5f803e3d5ffd5b5050604080515f80825260208201529081018b905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600162000f95565b80516080805463ffffffff191663ffffffff9092169190911790555f5b8151811015620010e85781818151811062001c1d5762001c1d62004c06565b602002602001015160815f83600162001c37919062004c1a565b63ffffffff16815260208101919091526040015f20600501558062001c5c8162004c30565b91505062001bfe565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff1615801562001d185750336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001ce6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001d0c919062004c4b565b6001600160a01b031614155b1562001d3757604051630d03687f60e11b815260040160405180910390fd5b6001600160a01b0382165f9081526082602052604081205463ffffffff169081900362001d77576040516374a086a360e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff16600181111562001daf5762001daf62004188565b1462001dce576040516390db0d0760e01b815260040160405180910390fd5b60068101546001600160401b039081169084168111158062001e07575060068201546001600160401b03600160401b9091048116908516105b1562001e265760405163cb23ebdf60e01b815260040160405180910390fd5b805b846001600160401b0316816001600160401b03161462001eca576001600160401b038082165f908152600385016020526040902060010154600160401b9004811690861681101562001e8d57604051639753965f60e01b815260040160405180910390fd5b6001600160401b039091165f908152600384016020526040812090815560010180546fffffffffffffffffffffffffffffffff1916905562001e28565b60068301805467ffffffffffffffff19166001600160401b03871617905562001ef4858362004c69565b608480545f9062001f109084906001600160401b031662004c69565b82546101009290920a6001600160401b0381810219909316918316021790915586165f8181526003860160205260409081902054905163334d6f6760e11b8152600481019290925260248201526001600160a01b038816915063669adece906044015f604051808303815f87803b15801562001f8a575f80fd5b505af115801562001f9d573d5f803e3d5ffd5b505050506001600160401b0385165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e6200202b81620031b5565b6001600160401b0385165f9081526083602052604090205463ffffffff161562002068576040516337c8fe0960e11b815260040160405180910390fd5b63ffffffff6001600160401b03861611156200209757604051634c753f5760e01b815260040160405180910390fd5b6001600160a01b0388165f9081526082602052604090205463ffffffff1615620020d457604051630d409b9360e41b815260040160405180910390fd5b608080545f91908290620020ee9063ffffffff1662004aed565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f886001600160401b03166001600160401b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b6001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550878160010160146101000a8154816001600160401b0302191690836001600160401b0316021790555088816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555086815f0160146101000a8154816001600160401b0302191690836001600160401b03160217905550848160070160106101000a81548160ff0219169083600181111562002278576200227862004188565b0217905550600185600181111562002294576200229462004188565b03620022ae576009810184905560058101869055620022c1565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a604051620023039695949392919062004c8c565b60405180910390a250505050505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156200237e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023a4919062004ba1565b6084549091505f90620023ca906001600160401b03600160401b82048116911662004c69565b6001600160401b03169050805f03620023e5575f9250505090565b620023f1818362004ced565b9250505090565b606f545f9060ff16156200241f57604051630bc011ff60e21b815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362002456576040516371653c1560e01b815260040160405180910390fd5b836001600160401b03165f036200248057604051632590ccf960e01b815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154600160801b900460ff166001811115620024b857620024b862004188565b14620024d7576040516390db0d0760e01b815260040160405180910390fd5b608480548691905f90620024f69084906001600160401b031662004aa9565b82546101009290920a6001600160401b0381810219909316918316021790915560068301541690505f6200252b878362004aa9565b6006840180546001600160401b0383811667ffffffffffffffff199092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c018352859020935184559151600193909301805492518716600160401b026fffffffffffffffffffffffffffffffff199093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200262090869086868662003858565b90505b949350505050565b6080545f9063ffffffff168082036200264557505f919050565b5f816001600160401b0381111562002661576200266162004244565b6040519080825280602002602001820160405280156200268b578160200160208202803683370190505b5090505f5b82811015620026fb5760815f620026a983600162004c1a565b63ffffffff1663ffffffff1681526020019081526020015f2060050154828281518110620026db57620026db62004c06565b602090810291909101015280620026f28162004c30565b91505062002690565b505f60205b8360011462002953575f6200271760028662004d03565b6200272460028762004ced565b62002730919062004c1a565b90505f816001600160401b038111156200274e576200274e62004244565b60405190808252806020026020018201604052801562002778578160200160208202803683370190505b5090505f5b82811015620028ff576200279360018462004d19565b81148015620027ae5750620027aa60028862004d03565b6001145b15620028365785620027c282600262004ad3565b81518110620027d557620027d562004c06565b602002602001015185604051602001620027f9929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002824576200282462004c06565b602002602001018181525050620028ea565b856200284482600262004ad3565b8151811062002857576200285762004c06565b6020026020010151868260026200286f919062004ad3565b6200287c90600162004c1a565b815181106200288f576200288f62004c06565b6020026020010151604051602001620028b2929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028dd57620028dd62004c06565b6020026020010181815250505b80620028f68162004c30565b9150506200277d565b50809450819550838460405160200162002923929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029489062004d2f565b935050505062002700565b5f835f8151811062002969576200296962004c06565b602002602001015190505f5b82811015620029e957604080516020810184905290810185905260600160408051601f19818403018152828252805160209182012090830187905290820186905292506060016040516020818303038152906040528051906020012093508080620029e09062004c30565b91505062002975565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002a1f81620031b5565b607e80545f9190829062002a399063ffffffff1662004aed565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060018081111562002a6d5762002a6d62004188565b86600181111562002a825762002a8262004188565b0362002aae57841562002aa8576040516363d722e760e01b815260040160405180910390fd5b62002ace565b821562002ace576040516363d722e760e01b815260040160405180910390fd5b6040518060e001604052808a6001600160a01b03168152602001896001600160a01b03168152602001886001600160401b0316815260200187600181111562002b1b5762002b1b62004188565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f825291829020845181546001600160a01b0391821673ffffffffffffffffffffffffffffffffffffffff199091161782559185015160018281018054958801516001600160401b0316600160a01b026001600160e01b0319909616929094169190911793909317808355938501519093909260ff60e01b1990911690600160e01b90849081111562002bd75762002bd762004188565b02179055506080820151600182018054911515600160e81b0260ff60e81b1990921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002c5b908c908c908c908c908c908c908c9062004d47565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002c9a81620031b5565b62002ca78484846200393d565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002cd981620031b5565b683635c9adc5dea0000082118062002cf45750633b9aca0082105b1562002d1357604051638586952560e01b815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f8281526034602052604090206001015462002d6b81620031b5565b620010ad8383620035f6565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002da381620031b5565b6087805467ffffffffffffffff1916426001600160401b031617905560408051636de0b4bb60e11b815290517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163dbc16976916004808301925f92919082900301818387803b15801562002e1f575f80fd5b505af115801562002e32573d5f803e3d5ffd5b5050505062002e4062003c23565b50565b336001600160a01b0316826001600160a01b031663f851a4406040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002e8a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002eb0919062004c4b565b6001600160a01b03161462002ed85760405163696072e960e01b815260040160405180910390fd5b6001600160a01b0382165f9081526082602090815260408083205463ffffffff1683526081909152902060068101546001600160401b03808216600160401b909204161462002f3a5760405163664316a560e11b815260040160405180910390fd5b600781015463ffffffff8316600160401b9091046001600160401b03161062002f7657604051633e37e23360e01b815260040160405180910390fd5b604080515f815260208101909152620010ad90849084906200393d565b62002ff860408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f9081526081602090815260409182902080546001600160a01b038082168652600160a01b918290046001600160401b039081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a0860152600160401b808204841660c0870152600160801b808304851660e0880152600160c01b9092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff1690811115620030d357620030d362004188565b90816001811115620030e957620030e962004188565b8152505050919050565b5f54610100900460ff16620010835760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000a4f565b620010e8828262003572565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b62002e40813362003c7b565b5f80620031e089600601546001600160401b03600160401b9091041690565b60078a01549091506001600160401b039081169089161015620032165760405163ead1340b60e01b815260040160405180910390fd5b6001600160401b0388165f90815260028a01602052604090205491508162003251576040516324cbdcc360e11b815260040160405180910390fd5b806001600160401b0316886001600160401b031611156200328557604051630f2b74f160e11b815260040160405180910390fd5b806001600160401b0316876001600160401b031611620032b85760405163b9b18f5760e01b815260040160405180910390fd5b5f620032c98a8a8a8a878b62003701565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620032ff919062004daa565b602060405180830381855afa1580156200331b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003340919062004ba1565b6200334c919062004d03565b60018c0154604080516020810182528381529051634890ed4560e11b81529293506001600160a01b0390911691639121da8a91620033909189919060040162004dc7565b602060405180830381865afa158015620033ac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033d2919062004e03565b620033f0576040516309bde33960e01b815260040160405180910390fd5b5f620033fd848b62004c69565b90506200345687826001600160401b03166200341862002317565b62003424919062004ad3565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016919062003cbe565b80608460088282829054906101000a90046001600160401b03166200347c919062004aa9565b82546101009290920a6001600160401b038181021990931691831602179091556084805467ffffffffffffffff60801b1916600160801b428416021790558d546040516332c2d15360e01b8152918d166004830152602482018b90523360448301526001600160a01b031691506332c2d1539060640162001656565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003551575f80fd5b505af115801562003564573d5f803e3d5ffd5b505050506200108362003d27565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff16620010e8575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff1615620010e8575f8281526034602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f67ffffffff000000016001600160401b038316108015620036ae575067ffffffff00000001604083901c6001600160401b0316105b8015620036cf575067ffffffff00000001608083901c6001600160401b0316105b8015620036e7575067ffffffff0000000160c083901c105b15620036f557506001919050565b505f919050565b919050565b6001600160401b038086165f818152600389016020526040808220549388168252902054606092911580159062003736575081155b15620037555760405163340c614f60e11b815260040160405180910390fd5b8062003774576040516366385b5160e01b815260040160405180910390fd5b6200377f8462003678565b6200379d576040516305dae44f60e21b815260040160405180910390fd5b885460018a01546040516bffffffffffffffffffffffff193360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b82166074840152600160a01b94859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a90046001600160a01b03166001600160a01b031663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa158015620038ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620038d3919062004ba1565b60058701546008880154604080516020810193909352820152606081018790526001600160e01b031960e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff821615806200395c5750607e5463ffffffff908116908316115b156200397b57604051637512e5cb60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526082602052604081205463ffffffff1690819003620039bb576040516374a086a360e01b815260040160405180910390fd5b63ffffffff8181165f908152608160205260409020600781015490918516600160401b9091046001600160401b03160362003a0957604051634f61d51960e01b815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001810154600160e81b900460ff161562003a4b57604051633b8d3d9960e01b815260040160405180910390fd5b600181810154600160e01b900460ff169081111562003a6e5762003a6e62004188565b6007830154600160801b900460ff16600181111562003a915762003a9162004188565b1462003ab057604051635aa0d5f160e11b815260040160405180910390fd5b60018082018054918401805473ffffffffffffffffffffffffffffffffffffffff1981166001600160a01b03909416938417825591546001600160401b03600160a01b9182900416026001600160e01b031990921690921717905560038101546009830155600782018054600160401b63ffffffff8816026fffffffffffffffff0000000000000000199091161790555f62003b4c8462000d8a565b60078401805467ffffffffffffffff19166001600160401b038316179055825460405163278f794360e11b81529192506001600160a01b0389811692634f1ef2869262003ba0921690899060040162004e24565b5f604051808303815f87803b15801562003bb8575f80fd5b505af115801562003bcb573d5f803e3d5ffd5b50506040805163ffffffff8a811682526001600160401b0386166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff1662003c4757604051635386698160e01b815260040160405180910390fd5b606f805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f8281526034602090815260408083206001600160a01b038516845290915290205460ff16620010e857604051637615be1f60e11b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052620010ad90849062003d83565b606f5460ff161562003d4c57604051630bc011ff60e21b815260040160405180910390fd5b606f805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f62003dd9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662003e5b9092919063ffffffff16565b805190915015620010ad578080602001905181019062003dfa919062004e03565b620010ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000a4f565b60606200262384845f85855f80866001600160a01b0316858760405162003e83919062004daa565b5f6040518083038185875af1925050503d805f811462003ebf576040519150601f19603f3d011682016040523d82523d5f602084013e62003ec4565b606091505b5091509150620017ec878383876060831562003f445782515f0362003f3c576001600160a01b0385163b62003f3c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000a4f565b508162002623565b62002623838381511562003f5b5781518083602001fd5b8060405162461bcd60e51b815260040162000a4f91906200458b565b61091d8062004e4883390190565b6001600160a01b038116811462002e40575f80fd5b80356001600160401b0381168114620036fc575f80fd5b5f805f805f8060c0878903121562003fc7575f80fd5b863562003fd48162003f85565b955062003fe46020880162003f9a565b945062003ff46040880162003f9a565b93506060870135620040068162003f85565b92506080870135620040188162003f85565b915060a08701356200402a8162003f85565b809150509295509295509295565b803563ffffffff81168114620036fc575f80fd5b5f602082840312156200405d575f80fd5b620040688262004038565b9392505050565b5f805f805f805f806103e0808a8c03121562004089575f80fd5b620040948a62004038565b9850620040a460208b0162003f9a565b9750620040b460408b0162003f9a565b9650620040c460608b0162003f9a565b955060808a0135945060a08a0135935060c08a0135620040e48162003f85565b92508981018b1015620040f5575f80fd5b5060e0890190509295985092959890939650565b5f602082840312156200411a575f80fd5b5035919050565b5f806040838503121562004133575f80fd5b6200413e8362004038565b91506200414e6020840162003f9a565b90509250929050565b5f806040838503121562004169575f80fd5b8235915060208301356200417d8162003f85565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60028110620041b957634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b038881168252871660208201526001600160401b038616604082015260e08101620041f360608301876200419c565b931515608082015260a081019290925260c090910152949350505050565b5f805f6060848603121562004224575f80fd5b6200422f8462004038565b95602085013595506040909401359392505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562004283576200428362004244565b604052919050565b5f6001600160401b03831115620042a657620042a662004244565b620042bb601f8401601f191660200162004258565b9050828152838383011115620042cf575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112620042f5575f80fd5b62004068838335602085016200428b565b5f805f805f805f60e0888a0312156200431d575f80fd5b620043288862004038565b9650620043386020890162003f9a565b955060408801356200434a8162003f85565b945060608801356200435c8162003f85565b935060808801356200436e8162003f85565b925060a08801356001600160401b03808211156200438a575f80fd5b620043988b838c01620042e5565b935060c08a0135915080821115620043ae575f80fd5b50620043bd8a828b01620042e5565b91505092959891949750929550565b81516001600160a01b0316815261018081016020830151620043f960208401826001600160401b03169052565b5060408301516200441560408401826001600160a01b03169052565b5060608301516200443160608401826001600160401b03169052565b506080830151608083015260a08301516200445760a08401826001600160401b03169052565b5060c08301516200447360c08401826001600160401b03169052565b5060e08301516200448f60e08401826001600160401b03169052565b50610100838101516001600160401b03169083015261012080840151620044b9828501826200419c565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c08789031215620044ee575f80fd5b620044f98762004038565b9550620045096020880162003f9a565b9450620045196040880162003f9a565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620045565781810151838201526020016200453c565b50505f910152565b5f8151808452620045778160208601602086016200453a565b601f01601f19169290920160200192915050565b602081525f6200406860208301846200455e565b5f60208284031215620045b0575f80fd5b620040688262003f9a565b5f805f805f8060a08789031215620045d1575f80fd5b620045dc8762004038565b9550620045ec6020880162004038565b9450604087013593506060870135925060808701356001600160401b038082111562004616575f80fd5b818901915089601f8301126200462a575f80fd5b81358181111562004639575f80fd5b8a60208285010111156200464b575f80fd5b6020830194508093505050509295509295509295565b5f602080838503121562004673575f80fd5b82356001600160401b03808211156200468a575f80fd5b818501915085601f8301126200469e575f80fd5b813581811115620046b357620046b362004244565b8060051b9150620046c684830162004258565b8181529183018401918481019088841115620046e0575f80fd5b938501935b838510156200470057843582529385019390850190620046e5565b98975050505050505050565b5f80604083850312156200471e575f80fd5b82356200413e8162003f85565b803560028110620036fc575f80fd5b5f805f805f805f60e0888a03121562004751575f80fd5b87356200475e8162003f85565b96506020880135620047708162003f85565b9550620047806040890162003f9a565b9450620047906060890162003f9a565b935060808801359250620047a760a089016200472b565b915060c0880135905092959891949750929550565b5f8060408385031215620047ce575f80fd5b620047d98362003f9a565b946020939093013593505050565b5f805f8060808587031215620047fb575f80fd5b620048068562004038565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a03121562004837575f80fd5b8735620048448162003f85565b96506020880135620048568162003f85565b9550620048666040890162003f9a565b945062004876606089016200472b565b93506080880135925060a08801356001600160401b0381111562004898575f80fd5b620048a68a828b01620042e5565b92505060c0880135905092959891949750929550565b5f805f60608486031215620048cf575f80fd5b8335620048dc8162003f85565b9250620048ec6020850162004038565b915060408401356001600160401b0381111562004907575f80fd5b8401601f8101861362004918575f80fd5b62004929868235602084016200428b565b9150509250925092565b5f6020828403121562004944575f80fd5b8135620040688162003f85565b5f806040838503121562004963575f80fd5b8235620049708162003f85565b91506200414e6020840162004038565b81516001600160a01b0316815261018081016020830151620049ad60208401826001600160401b03169052565b506040830151620049c960408401826001600160a01b03169052565b506060830151620049e560608401826001600160401b03169052565b506080830151608083015260a083015162004a0b60a08401826001600160401b03169052565b5060c083015162004a2760c08401826001600160401b03169052565b5060e083015162004a4360e08401826001600160401b03169052565b50610100838101516001600160401b03908116918401919091526101208085015182169084015261014080850151909116908301526101608084015162004a8d828501826200419c565b505092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111562004acc5762004acc62004a95565b5092915050565b808202811582820484141762000db35762000db362004a95565b5f63ffffffff80831681810362004b085762004b0862004a95565b6001019392505050565b5f6001600160a01b038086168352808516602084015250606060408301526200262060608301846200455e565b5f6001600160a01b038089168352808816602084015263ffffffff8716604084015280861660608401525060c0608083015262004b8060c08301856200455e565b82810360a084015262004b9481856200455e565b9998505050505050505050565b5f6020828403121562004bb2575f80fd5b5051919050565b848152606060208201525f62004bd360608301866200455e565b8281036040840152838152838560208301375f602085830101526020601f19601f86011682010191505095945050505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111562000db35762000db362004a95565b5f6001820162004c445762004c4462004a95565b5060010190565b5f6020828403121562004c5c575f80fd5b8151620040688162003f85565b6001600160401b0382811682821603908082111562004acc5762004acc62004a95565b6001600160401b0387811682526001600160a01b0387166020830152858116604083015260c082019062004cc460608401876200419c565b93909316608082015260a00152949350505050565b634e487b7160e01b5f52601260045260245ffd5b5f8262004cfe5762004cfe62004cd9565b500490565b5f8262004d145762004d1462004cd9565b500690565b8181038181111562000db35762000db362004a95565b5f8162004d405762004d4062004a95565b505f190190565b6001600160a01b038881168252871660208201526001600160401b03861660408201525f62004d7a60608301876200419c565b84608083015260e060a083015262004d9660e08301856200455e565b90508260c083015298975050505050505050565b5f825162004dbd8184602087016200453a565b9190910192915050565b6103208101610300808584378201835f5b600181101562004df957815183526020928301929091019060010162004dd8565b5050509392505050565b5f6020828403121562004e14575f80fd5b8151801515811462004068575f80fd5b6001600160a01b0383168152604060208201525f6200262360408301846200455e56fe60a06040526040516200091d3803806200091d833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f80516020620008fd833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f80516020620008fd83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b608051610479620004845f395f601001526104795ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610081575f357fffffffff000000000000000000000000000000000000000000000000000000001663278f794360e11b1461007957610077610085565b565b610077610095565b6100775b6100776100906100c3565b6100fa565b5f806100a43660048184610313565b8101906100b1919061034e565b915091506100bf8282610118565b5050565b5f6100f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e808015610114573d5ff35b3d5ffd5b61012182610172565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561016a5761016582826101fa565b505050565b6100bf61026c565b806001600160a01b03163b5f036101ac57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102169190610417565b5f60405180830381855af49150503d805f811461024e576040519150601f19603f3d011682016040523d82523d5f602084013e610253565b606091505b509150915061026385838361028b565b95945050505050565b34156100775760405163b398979f60e01b815260040160405180910390fd5b6060826102a05761029b826102ea565b6102e3565b81511580156102b757506001600160a01b0384163b155b156102e057604051639996b31560e01b81526001600160a01b03851660048201526024016101a3565b50805b9392505050565b8051156102fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610321575f80fd5b8386111561032d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561035f575f80fd5b82356001600160a01b0381168114610375575f80fd5b9150602083013567ffffffffffffffff80821115610391575f80fd5b818501915085601f8301126103a4575f80fd5b8135818111156103b6576103b661033a565b604051601f8201601f19908116603f011681019083821181831017156103de576103de61033a565b816040528281528860208487010111156103f6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610436576020818601810151858301520161041c565b505f92019182525091905056fea264697066735822122021e23b4641727aa4aa8fd2d3ef7960a43cab420d4c8632503bedc3eb2d30690764736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212200ba7709ac5122ac8329e53f4c86801ef6b95d32e3af0d4683702b6e1064e468764736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonRollupManagerMockInternalTest.json b/compiled-contracts/PolygonRollupManagerMockInternalTest.json
index 51771aefc..963e25ad5 100644
--- a/compiled-contracts/PolygonRollupManagerMockInternalTest.json
+++ b/compiled-contracts/PolygonRollupManagerMockInternalTest.json
@@ -34,6 +34,16 @@
"name": "AddressDoNotHaveRequiredRole",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "AllBatchesMustBeVerified",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AllSequencedMustBeVerified",
+ "type": "error"
+ },
{
"inputs": [],
"name": "AllzkEVMSequencedBatchesMustBeVerified",
@@ -44,11 +54,26 @@
"name": "BatchFeeOutOfRange",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "CannotUpdateWithUnconsolidatedPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ChainIDAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "ChainIDOutOfRange",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "EmptyVerifySequencesData",
+ "type": "error"
+ },
{
"inputs": [],
"name": "ExceedMaxVerifyBatches",
@@ -64,11 +89,26 @@
"name": "FinalNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceBelowLastVerifiedSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FinalNumSequenceDoesNotMatchPendingState",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalPendingStateNumInvalid",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootNotExist",
+ "type": "error"
+ },
{
"inputs": [],
"name": "HaltTimeoutNotExpired",
@@ -89,6 +129,21 @@
"name": "InitNumBatchDoesNotMatchPendingState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InitSequenceMustMatchCurrentForkID",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InitSequenceNumDoesNotMatchPendingState",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidPessimisticProof",
+ "type": "error"
+ },
{
"inputs": [],
"name": "InvalidProof",
@@ -104,11 +159,41 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "InvalidRangeMultiplierZkGasPrice",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRangeSequenceTimeTarget",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollup",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidRollupType",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidVerifierType",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MustSequenceSomeBatch",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "MustSequenceSomeBlob",
+ "type": "error"
+ },
{
"inputs": [],
"name": "NewAccInputHashDoesNotExist",
@@ -129,6 +214,11 @@
"name": "NewTrustedAggregatorTimeoutMustBeLower",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "NotAllowedAddress",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OldAccInputHashDoesNotExist",
@@ -139,6 +229,11 @@
"name": "OldStateRootDoesNotExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyChainsWithPessimisticProofs",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyEmergencyState",
@@ -149,6 +244,16 @@
"name": "OnlyNotEmergencyState",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyRollupAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyStateTransitionChains",
+ "type": "error"
+ },
{
"inputs": [],
"name": "PendingStateDoesNotExist",
@@ -164,11 +269,31 @@
"name": "PendingStateNotConsolidable",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "PendingStateNumExist",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotEndOfSequence",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RollbackBatchIsNotValid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupAddressAlreadyExist",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "RollupIDNotAscendingOrder",
+ "type": "error"
+ },
{
"inputs": [],
"name": "RollupMustExist",
@@ -204,11 +329,21 @@
"name": "UpdateNotCompatible",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "UpdateToOldRollupTypeID",
+ "type": "error"
+ },
{
"inputs": [],
"name": "UpdateToSameRollupTypeID",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "zkGasPriceOfRange",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -238,8 +373,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -247,6 +382,12 @@
"internalType": "uint64",
"name": "lastVerifiedBatchBeforeUpgrade",
"type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "AddExistingRollup",
@@ -281,8 +422,8 @@
},
{
"indexed": false,
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -296,46 +437,15 @@
"internalType": "string",
"name": "description",
"type": "string"
- }
- ],
- "name": "AddNewRollupType",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
- "name": "exitRoot",
+ "name": "programVKey",
"type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
}
],
- "name": "ConsolidatePendingState",
+ "name": "AddNewRollupType",
"type": "event"
},
{
@@ -432,62 +542,6 @@
"name": "OnSequenceBatches",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
- }
- ],
- "name": "OverridePendingState",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "storedStateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "provedStateRoot",
- "type": "bytes32"
- }
- ],
- "name": "ProveNonDeterministicPendingState",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [
@@ -567,26 +621,25 @@
"anonymous": false,
"inputs": [
{
- "indexed": false,
- "internalType": "uint256",
- "name": "newBatchFee",
- "type": "uint256"
- }
- ],
- "name": "SetBatchFee",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
{
"indexed": false,
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
}
],
- "name": "SetMultiplierBatchFee",
+ "name": "RollbackBatches",
"type": "event"
},
{
@@ -594,12 +647,12 @@
"inputs": [
{
"indexed": false,
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
+ "internalType": "uint256",
+ "name": "newBatchFee",
+ "type": "uint256"
}
],
- "name": "SetPendingStateTimeout",
+ "name": "SetBatchFee",
"type": "event"
},
{
@@ -615,32 +668,6 @@
"name": "SetTrustedAggregator",
"type": "event"
},
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
- "type": "uint64"
- }
- ],
- "name": "SetTrustedAggregatorTimeout",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
- }
- ],
- "name": "SetVerifyBatchTimeTarget",
- "type": "event"
- },
{
"anonymous": false,
"inputs": [
@@ -700,44 +727,7 @@
"type": "address"
}
],
- "name": "VerifyBatches",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "indexed": false,
- "internalType": "uint64",
- "name": "numBatch",
- "type": "uint64"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- },
- {
- "indexed": false,
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "indexed": true,
- "internalType": "address",
- "name": "aggregator",
- "type": "address"
- }
- ],
- "name": "VerifyBatchesTrustedAggregator",
+ "name": "VerifyBatchesTrustedAggregator",
"type": "event"
},
{
@@ -768,7 +758,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -784,13 +774,18 @@
},
{
"internalType": "bytes32",
- "name": "genesis",
+ "name": "initRoot",
"type": "bytes32"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addExistingRollup",
@@ -806,7 +801,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -816,8 +811,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -829,6 +824,11 @@
"internalType": "string",
"name": "description",
"type": "string"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"name": "addNewRollupType",
@@ -881,24 +881,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "consolidatePendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [
{
@@ -975,6 +957,40 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "rollupID",
+ "type": "uint32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "selectedGlobalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "newPessimisticRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getInputPessimisticBytes",
+ "outputs": [
+ {
+ "internalType": "bytes",
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -1094,52 +1110,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "batchNum",
- "type": "uint64"
- }
- ],
- "name": "getRollupPendingStateTransitions",
- "outputs": [
- {
- "components": [
- {
- "internalType": "uint64",
- "name": "timestamp",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "exitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "stateRoot",
- "type": "bytes32"
- }
- ],
- "internalType": "struct LegacyZKEVMStateVariables.PendingState",
- "name": "",
- "type": "tuple"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1307,30 +1277,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- }
- ],
- "name": "isPendingStateConsolidable",
- "outputs": [
- {
- "internalType": "bool",
- "name": "",
- "type": "bool"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [],
"name": "lastAggregationTimestamp",
@@ -1357,19 +1303,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "multiplierBatchFee",
- "outputs": [
- {
- "internalType": "uint16",
- "name": "",
- "type": "uint16"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1408,190 +1341,180 @@
"type": "function"
},
{
- "inputs": [
- {
- "internalType": "uint32",
- "name": "rollupID",
- "type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
+ "inputs": [],
+ "name": "pol",
+ "outputs": [
{
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
+ "internalType": "contract IERC20Upgradeable",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
{
"internalType": "bytes32",
- "name": "newLocalExitRoot",
+ "name": "role",
"type": "bytes32"
},
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
{
"internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "role",
"type": "bytes32"
},
{
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
}
],
- "name": "overridePendingState",
+ "name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
- "inputs": [],
- "name": "pendingStateTimeout",
- "outputs": [
+ "inputs": [
+ {
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
+ },
{
"internalType": "uint64",
- "name": "",
+ "name": "targetBatch",
"type": "uint64"
}
],
- "stateMutability": "view",
+ "name": "rollbackBatches",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
- "inputs": [],
- "name": "pol",
- "outputs": [
+ "inputs": [
{
- "internalType": "contract IERC20Upgradeable",
- "name": "",
+ "internalType": "address",
+ "name": "rollupAddress",
"type": "address"
}
],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [
+ "name": "rollupAddressToID",
+ "outputs": [
{
"internalType": "uint32",
"name": "rollupID",
"type": "uint32"
- },
- {
- "internalType": "uint64",
- "name": "initPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalPendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "newLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32",
- "name": "newStateRoot",
- "type": "bytes32"
- },
- {
- "internalType": "bytes32[24]",
- "name": "proof",
- "type": "bytes32[24]"
- }
- ],
- "name": "proveNonDeterministicPendingState",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "role",
- "type": "bytes32"
- },
- {
- "internalType": "address",
- "name": "account",
- "type": "address"
}
],
- "name": "renounceRole",
- "outputs": [],
- "stateMutability": "nonpayable",
+ "stateMutability": "view",
"type": "function"
},
{
- "inputs": [
- {
- "internalType": "bytes32",
- "name": "role",
- "type": "bytes32"
- },
+ "inputs": [],
+ "name": "rollupCount",
+ "outputs": [
{
- "internalType": "address",
- "name": "account",
- "type": "address"
+ "internalType": "uint32",
+ "name": "",
+ "type": "uint32"
}
],
- "name": "revokeRole",
- "outputs": [],
- "stateMutability": "nonpayable",
+ "stateMutability": "view",
"type": "function"
},
{
"inputs": [
- {
- "internalType": "address",
- "name": "rollupAddress",
- "type": "address"
- }
- ],
- "name": "rollupAddressToID",
- "outputs": [
{
"internalType": "uint32",
"name": "rollupID",
"type": "uint32"
}
],
- "stateMutability": "view",
- "type": "function"
- },
- {
- "inputs": [],
- "name": "rollupCount",
+ "name": "rollupIDToRollupData",
"outputs": [
{
- "internalType": "uint32",
- "name": "",
- "type": "uint32"
+ "components": [
+ {
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingState",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "_legacyLastPendingStateConsolidated",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturn",
+ "name": "rollupData",
+ "type": "tuple"
}
],
"stateMutability": "view",
@@ -1605,67 +1528,74 @@
"type": "uint32"
}
],
- "name": "rollupIDToRollupData",
+ "name": "rollupIDToRollupDataV2",
"outputs": [
{
- "internalType": "contract IPolygonRollupBase",
- "name": "rollupContract",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "chainID",
- "type": "uint64"
- },
- {
- "internalType": "contract IVerifierRollup",
- "name": "verifier",
- "type": "address"
- },
- {
- "internalType": "uint64",
- "name": "forkID",
- "type": "uint64"
- },
- {
- "internalType": "bytes32",
- "name": "lastLocalExitRoot",
- "type": "bytes32"
- },
- {
- "internalType": "uint64",
- "name": "lastBatchSequenced",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingState",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastPendingStateConsolidated",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "lastVerifiedBatchBeforeUpgrade",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "rollupTypeID",
- "type": "uint64"
- },
- {
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
- "type": "uint8"
+ "components": [
+ {
+ "internalType": "contract IPolygonRollupBase",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "chainID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "address",
+ "name": "verifier",
+ "type": "address"
+ },
+ {
+ "internalType": "uint64",
+ "name": "forkID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastLocalExitRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastBatchSequenced",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "lastVerifiedBatchBeforeUpgrade",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "rollupTypeID",
+ "type": "uint64"
+ },
+ {
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "lastPessimisticRoot",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
+ }
+ ],
+ "internalType": "struct PolygonRollupManager.RollupDataReturnV2",
+ "name": "rollupData",
+ "type": "tuple"
}
],
"stateMutability": "view",
@@ -1700,7 +1630,7 @@
"type": "address"
},
{
- "internalType": "contract IVerifierRollup",
+ "internalType": "address",
"name": "verifier",
"type": "address"
},
@@ -1710,8 +1640,8 @@
"type": "uint64"
},
{
- "internalType": "uint8",
- "name": "rollupCompatibilityID",
+ "internalType": "enum IPolygonRollupManager.VerifierType",
+ "name": "rollupVerifierType",
"type": "uint8"
},
{
@@ -1723,6 +1653,11 @@
"internalType": "bytes32",
"name": "genesis",
"type": "bytes32"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
}
],
"stateMutability": "view",
@@ -1741,58 +1676,6 @@
"stateMutability": "nonpayable",
"type": "function"
},
- {
- "inputs": [
- {
- "internalType": "uint16",
- "name": "newMultiplierBatchFee",
- "type": "uint16"
- }
- ],
- "name": "setMultiplierBatchFee",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newPendingStateTimeout",
- "type": "uint64"
- }
- ],
- "name": "setPendingStateTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newTrustedAggregatorTimeout",
- "type": "uint64"
- }
- ],
- "name": "setTrustedAggregatorTimeout",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "inputs": [
- {
- "internalType": "uint64",
- "name": "newVerifyBatchTimeTarget",
- "type": "uint64"
- }
- ],
- "name": "setVerifyBatchTimeTarget",
- "outputs": [],
- "stateMutability": "nonpayable",
- "type": "function"
- },
{
"inputs": [],
"name": "totalSequencedBatches",
@@ -1819,19 +1702,6 @@
"stateMutability": "view",
"type": "function"
},
- {
- "inputs": [],
- "name": "trustedAggregatorTimeout",
- "outputs": [
- {
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
- }
- ],
- "stateMutability": "view",
- "type": "function"
- },
{
"inputs": [
{
@@ -1856,16 +1726,21 @@
"type": "function"
},
{
- "inputs": [],
- "name": "verifyBatchTimeTarget",
- "outputs": [
+ "inputs": [
{
- "internalType": "uint64",
- "name": "",
- "type": "uint64"
+ "internalType": "contract ITransparentUpgradeableProxy",
+ "name": "rollupContract",
+ "type": "address"
+ },
+ {
+ "internalType": "uint32",
+ "name": "newRollupTypeID",
+ "type": "uint32"
}
],
- "stateMutability": "view",
+ "name": "updateRollupByRollupAdmin",
+ "outputs": [],
+ "stateMutability": "nonpayable",
"type": "function"
},
{
@@ -1911,7 +1786,7 @@
"type": "bytes32[24]"
}
],
- "name": "verifyBatches",
+ "name": "verifyBatchesTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
@@ -1924,19 +1799,9 @@
"type": "uint32"
},
{
- "internalType": "uint64",
- "name": "pendingStateNum",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "initNumBatch",
- "type": "uint64"
- },
- {
- "internalType": "uint64",
- "name": "finalNewBatch",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "selectedGlobalExitRoot",
+ "type": "bytes32"
},
{
"internalType": "bytes32",
@@ -1945,28 +1810,23 @@
},
{
"internalType": "bytes32",
- "name": "newStateRoot",
+ "name": "newPessimisticRoot",
"type": "bytes32"
},
{
- "internalType": "address",
- "name": "beneficiary",
- "type": "address"
- },
- {
- "internalType": "bytes32[24]",
+ "internalType": "bytes",
"name": "proof",
- "type": "bytes32[24]"
+ "type": "bytes"
}
],
- "name": "verifyBatchesTrustedAggregator",
+ "name": "verifyPessimisticTrustedAggregator",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
- "bytecode": "0x60e060405234801562000010575f80fd5b5060405162006fae38038062006fae83398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051616dbe620001f05f395f8181610b8a0152818161273d015261444d01525f818161090f015281816135c5015261481e01525f8181610add01528181611358015281816115780152818161242b01526146f80152616dbe5ff3fe608060405234801562000010575f80fd5b50600436106200038c575f3560e01c8063841b24d711620001e3578063c1acbc341162000113578063dbc1697611620000ab578063e46761c41162000083578063e46761c41462000b84578063f34eb8eb1462000bac578063f4e926751462000bc3578063f9c4c2ae1462000bd4575f80fd5b8063dbc169761462000b42578063dde0ff771462000b4c578063e0bfd3d21462000b6d575f80fd5b8063d02103ca11620000eb578063d02103ca1462000ad7578063d5073f6f1462000aff578063d547741f1462000b16578063d939b3151462000b2d575f80fd5b8063c1acbc341462000a6f578063c4c928c21462000a98578063ceee281d1462000aaf575f80fd5b80639c9f3dfe1162000187578063a2967d99116200015f578063a2967d9914620008ff578063a3c573eb1462000909578063afd23cbe1462000957578063b99d0ad7146200098e575f80fd5b80639c9f3dfe14620008c9578063a066215c14620008e0578063a217fddf14620008f7575f80fd5b806391d1485411620001bb57806391d14854146200086057806399f5634e14620008a85780639a908e7314620008b2575f80fd5b8063841b24d7146200080157806387c20c0114620008325780638bd4f0711462000849575f80fd5b80632528016911620002bf57806355a71ee011620002635780637222020f116200023b5780637222020f1462000785578063727885e9146200079c5780637975fcfe14620007b35780637fb6e76a14620007d9575f80fd5b806355a71ee0146200062957806360469169146200066d57806365c0504d1462000677575f80fd5b806336568abe116200029757806336568abe14620005f2578063394218e91462000609578063477fa2701462000620575f80fd5b806325280169146200050b5780632f2ff15d14620005c657806330c27dde14620005dd575f80fd5b80631489ed1011620003335780631796a1ae116200030b5780631796a1ae146200048f5780631816b7e514620004b65780632072f6c514620004cd578063248a9ca314620004d7575f80fd5b80631489ed10146200045357806315064c96146200046a5780631608859c1462000478575f80fd5b80630a0d9fbe11620003675780630a0d9fbe146200040457806311f6b287146200042557806312b86e19146200043c575f80fd5b80630645af091462000390578063066ec01214620003a9578063080b311114620003dc575b5f80fd5b620003a7620003a136600462005780565b62000d3e565b005b608454620003be9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b620003f3620003ed36600462005869565b62001224565b6040519015158152602001620003d3565b608554620003be9068010000000000000000900467ffffffffffffffff1681565b620003be620004363660046200589f565b6200124d565b620003a76200044d366004620058cd565b6200126c565b620003a7620004643660046200595f565b6200148c565b606f54620003f39060ff1681565b620003a76200048936600462005869565b6200166b565b607e54620004a09063ffffffff1681565b60405163ffffffff9091168152602001620003d3565b620003a7620004c7366004620059e4565b62001747565b620003a762001844565b620004fc620004e836600462005a0e565b5f9081526034602052604090206001015490565b604051908152602001620003d3565b620005916200051c36600462005869565b60408051606080820183525f808352602080840182905292840181905263ffffffff9590951685526081825282852067ffffffffffffffff9485168652600301825293829020825194850183528054855260010154808416918501919091526801000000000000000090049091169082015290565b604080518251815260208084015167ffffffffffffffff908116918301919091529282015190921690820152606001620003d3565b620003a7620005d736600462005a26565b62001958565b608754620003be9067ffffffffffffffff1681565b620003a76200060336600462005a26565b62001980565b620003a76200061a36600462005a57565b620019e0565b608654620004fc565b620004fc6200063a36600462005869565b63ffffffff82165f90815260816020908152604080832067ffffffffffffffff8516845260020190915290205492915050565b620004fc62001afb565b6200072d620006883660046200589f565b607f6020525f908152604090208054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff918216929182169167ffffffffffffffff740100000000000000000000000000000000000000008204169160ff7c010000000000000000000000000000000000000000000000000000000083048116927d0100000000000000000000000000000000000000000000000000000000009004169086565b6040805173ffffffffffffffffffffffffffffffffffffffff978816815296909516602087015267ffffffffffffffff9093169385019390935260ff166060840152901515608083015260a082015260c001620003d3565b620003a7620007963660046200589f565b62001b12565b620003a7620007ad36600462005b4f565b62001c8d565b620007ca620007c436600462005c16565b620021f6565b604051620003d3919062005ce7565b620004a0620007ea36600462005a57565b60836020525f908152604090205463ffffffff1681565b608454620003be907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b620003a7620008433660046200595f565b62002228565b620003a76200085a366004620058cd565b62002625565b620003f36200087136600462005a26565b5f91825260346020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b620004fc620026f6565b620003be620008c336600462005cfb565b62002804565b620003a7620008da36600462005a57565b62002a54565b620003a7620008f136600462005a57565b62002b3d565b620004fc5f81565b620004fc62002c27565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620003d3565b6085546200097a90700100000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001620003d3565b62000a296200099f36600462005869565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff9690961681526081865283812067ffffffffffffffff958616825260040186528390208351918201845280548086168352680100000000000000009004909416948101949094526001830154918401919091526002909101549082015290565b604051620003d391905f60808201905067ffffffffffffffff80845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b608454620003be90700100000000000000000000000000000000900467ffffffffffffffff1681565b620003a762000aa936600462005d26565b6200300f565b620004a062000ac036600462005db8565b60826020525f908152604090205463ffffffff1681565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000b1036600462005a0e565b6200345d565b620003a762000b2736600462005a26565b62003512565b608554620003be9067ffffffffffffffff1681565b620003a76200353a565b608454620003be9068010000000000000000900467ffffffffffffffff1681565b620003a762000b7e36600462005de7565b62003644565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000bbd36600462005e5f565b62003758565b608054620004a09063ffffffff1681565b62000cb062000be53660046200589f565b60816020525f90815260409020805460018201546005830154600684015460079094015473ffffffffffffffffffffffffffffffffffffffff80851695740100000000000000000000000000000000000000009586900467ffffffffffffffff908116969286169592909204821693928282169268010000000000000000808404821693700100000000000000000000000000000000808204841694780100000000000000000000000000000000000000000000000090920484169380831693830416910460ff168c565b6040805173ffffffffffffffffffffffffffffffffffffffff9d8e16815267ffffffffffffffff9c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620003d3565b5f54600290610100900460ff1615801562000d5f57505f5460ff8083169116105b62000df1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461010060ff84167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921691909117179055608580546084805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8e8116919091029190911790915567016345785d8a00006086558c167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176907080000000000000000177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff167103ea0000000000000000000000000000000017905562000efa6200399d565b62000f267f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c62003a35565b62000f325f8862003a35565b62000f5e7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003a35565b62000f8a7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003a35565b62000fb67f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003a35565b62000fe27fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003a35565b6200100e7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003a35565b6200103a7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003a35565b620010667fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db18962003a35565b620010b27f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003a41565b620010de7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003a35565b6200110a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003a35565b620011567f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003a41565b620011827f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e8762003a35565b620011ae7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003a35565b620011ba5f3362003a35565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062001244908362003a8b565b90505b92915050565b63ffffffff81165f908152608160205260408120620012479062003ad1565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620012988162003b67565b63ffffffff89165f908152608160205260409020620012be818a8a8a8a8a8a8a62003b73565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8981169182029290921783555f90815260028401602052604090208690556005830187905590547001000000000000000000000000000000009004161562001356576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200139c62002c27565b6040518263ffffffff1660e01b8152600401620013bb91815260200190565b5f604051808303815f87803b158015620013d3575f80fd5b505af1158015620013e6573d5f803e3d5ffd5b50506084805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a8000000000000000000000000000000000000000000000000017905550506040805167ffffffffffffffff881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620014b88162003b67565b63ffffffff89165f908152608160205260409020620014de818a8a8a8a8a8a8a62004052565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8a81169182029290921783555f90815260028401602052604090208790556005830188905590547001000000000000000000000000000000009004161562001576576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d620015bc62002c27565b6040518263ffffffff1660e01b8152600401620015db91815260200190565b5f604051808303815f87803b158015620015f3575f80fd5b505af115801562001606573d5f803e3d5ffd5b50506040805167ffffffffffffffff8b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f9081526081602090815260408083203384527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a9092529091205460ff166200173657606f5460ff1615620016f3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ff818362003a8b565b62001736576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001742818362004598565b505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1620017738162003b67565b6103e88261ffff1610806200178d57506103ff8261ffff16115b15620017c5576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000061ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200194c57608454700100000000000000000000000000000000900467ffffffffffffffff161580620018e257506084544290620018d69062093a8090700100000000000000000000000000000000900467ffffffffffffffff1662005f1f565b67ffffffffffffffff16115b806200191457506087544290620019089062093a809067ffffffffffffffff1662005f1f565b67ffffffffffffffff16115b156200194c576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620019566200481c565b565b5f82815260346020526040902060010154620019748162003b67565b620017428383620048a3565b73ffffffffffffffffffffffffffffffffffffffff81163314620019d0576040517f5a568e6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620019dc82826200495f565b5050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001a0c8162003b67565b606f5460ff1662001a7d5760845467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169083161062001a7d576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6084805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001838565b5f608654606462001b0d919062005f4a565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001b3e8162003b67565b63ffffffff8216158062001b5d5750607e5463ffffffff908116908316115b1562001b95576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff161515900362001c0e576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810180547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000017905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001cb98162003b67565b63ffffffff8816158062001cd85750607e5463ffffffff908116908916115b1562001d10576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff161515900362001d89576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f9081526083602052604090205463ffffffff161562001de0576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f9190829062001dfa9063ffffffff1662005f64565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f808252602082019283905293945073ffffffffffffffffffffffffffffffffffffffff90921691309162001e549062005738565b62001e629392919062005f89565b604051809103905ff08015801562001e7c573d5f803e3d5ffd5b5090508160835f8c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360010160149054906101000a900467ffffffffffffffff168160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360020154816002015f8067ffffffffffffffff1681526020019081526020015f20819055508b63ffffffff168160070160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162002153949392919063ffffffff94909416845273ffffffffffffffffffffffffffffffffffffffff928316602085015267ffffffffffffffff91909116604084015216606082015260800190565b60405180910390a26040517f7125702200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690637125702290620021b9908d908d9088908e908e908e9060040162005fcc565b5f604051808303815f87803b158015620021d1575f80fd5b505af1158015620021e4573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f9081526081602052604090206060906200221d90878787878762004a19565b979650505050505050565b606f5460ff161562002266576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f90815260816020908152604080832060845467ffffffffffffffff8a811686526003830190945291909320600101544292620022ca92780100000000000000000000000000000000000000000000000090048116911662005f1f565b67ffffffffffffffff1611156200230d576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86200231c88886200603b565b67ffffffffffffffff1611156200235f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002371818989898989898962004052565b6200237d818762004be0565b60855467ffffffffffffffff165f03620024c3576006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8981169182029290921783555f90815260028401602052604090208690556005830187905590547001000000000000000000000000000000009004161562002429576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200246f62002c27565b6040518263ffffffff1660e01b81526004016200248e91815260200190565b5f604051808303815f87803b158015620024a6575f80fd5b505af1158015620024b9573d5f803e3d5ffd5b50505050620025c5565b620024ce8162004de7565b600681018054700100000000000000000000000000000000900467ffffffffffffffff1690601062002500836200605f565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154700100000000000000000000000000000000900487165f90815260048a0190935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b6040805167ffffffffffffffff8816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562002663576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062002689818989898989898962003b73565b67ffffffffffffffff87165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620026eb6200481c565b505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002783573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620027a991906200607e565b6084549091505f90620027d59067ffffffffffffffff680100000000000000008204811691166200603b565b67ffffffffffffffff169050805f03620027f1575f9250505090565b620027fd8183620060c3565b9250505090565b606f545f9060ff161562002844576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362002894576040517f71653c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8367ffffffffffffffff165f03620028d8576040517f2590ccf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200290b90849067ffffffffffffffff1662005f1f565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560068301541690505f62002941878362005f1f565b60068401805467ffffffffffffffff8084167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b019091529290932090518155915160019290920180549151841668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169290931691909117179055905062002a058362004de7565b60405167ffffffffffffffff8216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002a808162003b67565b606f5460ff1662002ad55760855467ffffffffffffffff9081169083161062002ad5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff84169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001838565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002b698162003b67565b620151808267ffffffffffffffff16111562002bb1576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001838565b6080545f9063ffffffff1680820362002c4157505f919050565b5f8167ffffffffffffffff81111562002c5e5762002c5e62005a73565b60405190808252806020026020018201604052801562002c88578160200160208202803683370190505b5090505f5b8281101562002cf85760815f62002ca6836001620060d9565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002cd85762002cd8620060ef565b60209081029190910101528062002cef816200611c565b91505062002c8d565b505f60205b8360011462002f51575f62002d1460028662006156565b62002d21600287620060c3565b62002d2d9190620060d9565b90505f8167ffffffffffffffff81111562002d4c5762002d4c62005a73565b60405190808252806020026020018201604052801562002d76578160200160208202803683370190505b5090505f5b8281101562002efd5762002d916001846200616c565b8114801562002dac575062002da860028862006156565b6001145b1562002e34578562002dc082600262005f4a565b8151811062002dd35762002dd3620060ef565b60200260200101518560405160200162002df7929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002e225762002e22620060ef565b60200260200101818152505062002ee8565b8562002e4282600262005f4a565b8151811062002e555762002e55620060ef565b60200260200101518682600262002e6d919062005f4a565b62002e7a906001620060d9565b8151811062002e8d5762002e8d620060ef565b602002602001015160405160200162002eb0929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002edb5762002edb620060ef565b6020026020010181815250505b8062002ef4816200611c565b91505062002d7b565b50809450819550838460405160200162002f21929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002f469062006182565b935050505062002cfd565b5f835f8151811062002f675762002f67620060ef565b602002602001015190505f5b8281101562003005576040805160208101849052908101859052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002ffc906200611c565b91505062002f73565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200303b8162003b67565b63ffffffff841615806200305a5750607e5463ffffffff908116908516115b1562003092576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f9081526082602052604081205463ffffffff1690819003620030f8576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8181165f9081526081602052604090206007810154909187166801000000000000000090910467ffffffffffffffff160362003165576040517f4f61d51900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff86165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620031de576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018101546007830154700100000000000000000000000000000000900460ff9081167c010000000000000000000000000000000000000000000000000000000090920416146200325b576040517fb541abe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808201805491840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9094169384178255915467ffffffffffffffff740100000000000000000000000000000000000000009182900416027fffffffff000000000000000000000000000000000000000000000000000000009092169092171790556007820180546801000000000000000063ffffffff8a16027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790555f62003343846200124d565b6007840180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff831617905582546040517f4f1ef28600000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8b811692634f1ef28692620033d79216908b908b90600401620061b9565b5f604051808303815f87803b158015620033ef575f80fd5b505af115801562003402573d5f803e3d5ffd5b50506040805163ffffffff8c8116825267ffffffffffffffff86166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620034898162003b67565b683635c9adc5dea00000821180620034a45750633b9aca0082105b15620034dc576040517f8586952500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001838565b5f828152603460205260409020600101546200352e8162003b67565b6200174283836200495f565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620035668162003b67565b608780547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff16179055604080517fdbc1697600000000000000000000000000000000000000000000000000000000815290517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169163dbc16976916004808301925f92919082900301818387803b15801562003620575f80fd5b505af115801562003633573d5f803e3d5ffd5b505050506200364162004ef7565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620036708162003b67565b67ffffffffffffffff84165f9081526083602052604090205463ffffffff1615620036c7576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87165f9081526082602052604090205463ffffffff16156200372a576040517fd409b93000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200373b88888888875f62004f86565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590620037848162003b67565b607e80545f919082906200379e9063ffffffff1662005f64565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018767ffffffffffffffff1681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b528989898989896040516200398b9695949392919062006222565b60405180910390a25050505050505050565b5f54610100900460ff1662001956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000de8565b620019dc8282620048a3565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60855467ffffffffffffffff8281165f9081526004850160205260408120549092429262003abe92918116911662005f1f565b67ffffffffffffffff1611159392505050565b60068101545f90700100000000000000000000000000000000900467ffffffffffffffff161562003b445750600681015467ffffffffffffffff70010000000000000000000000000000000090910481165f90815260049092016020526040909120546801000000000000000090041690565b506006015468010000000000000000900467ffffffffffffffff1690565b919050565b62003641813362005209565b60078801545f9067ffffffffffffffff908116908716101562003bc2576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88161562003ca957600689015467ffffffffffffffff7001000000000000000000000000000000009091048116908916111562003c34576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f90815260048a016020526040902060028101548154909288811668010000000000000000909204161462003ca2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062003d56565b5067ffffffffffffffff85165f9081526002890160205260409020548062003cfd576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600689015467ffffffffffffffff680100000000000000009091048116908716111562003d56576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600689015467ffffffffffffffff7001000000000000000000000000000000009091048116908816118062003d9f57508767ffffffffffffffff168767ffffffffffffffff1611155b8062003dd95750600689015467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690881611155b1562003e11576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260048b01602052604090205468010000000000000000900481169086161462003e76576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003e878a888888868962004a19565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003ebd919062006287565b602060405180830381855afa15801562003ed9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003efe91906200607e565b62003f0a919062006156565b60018c01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a9162003f7491889190600401620062a4565b602060405180830381865afa15801562003f90573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003fb69190620062e0565b62003fed576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260048c01602052604090206002015485900362004045576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b5f806200405f8a62003ad1565b60078b015490915067ffffffffffffffff9081169089161015620040af576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891615620041985760068a015467ffffffffffffffff7001000000000000000000000000000000009091048116908a16111562004121576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808a165f90815260048c01602052604090206002810154815490945090918a811668010000000000000000909204161462004191576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200423c565b67ffffffffffffffff88165f90815260028b016020526040902054915081620041ed576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168867ffffffffffffffff1611156200423c576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff16116200428a576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200429b8b8a8a8a878b62004a19565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620042d1919062006287565b602060405180830381855afa158015620042ed573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200431291906200607e565b6200431e919062006156565b60018d01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a916200438891899190600401620062a4565b602060405180830381865afa158015620043a4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620043ca9190620062e0565b62004401576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200440e848b6200603b565b905062004475878267ffffffffffffffff166200442a620026f6565b62004436919062005f4a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919062005272565b80608460088282829054906101000a900467ffffffffffffffff166200449c919062005f1f565b82546101009290920a67ffffffffffffffff818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000428416021790558e546040517f32c2d153000000000000000000000000000000000000000000000000000000008152918d166004830152602482018b905233604483015273ffffffffffffffffffffffffffffffffffffffff1691506332c2d153906064015f604051808303815f87803b15801562004572575f80fd5b505af115801562004585573d5f803e3d5ffd5b5050505050505050505050505050505050565b600682015467ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908216111580620045fb5750600682015467ffffffffffffffff7001000000000000000000000000000000009091048116908216115b1562004633576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f818152600485016020908152604080832080546006890180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000092839004909816918202979097178755600280830154828752908a01909452919093209190915560018201546005870155835477ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000909302929092179092557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200473c62002c27565b6040518263ffffffff1660e01b81526004016200475b91815260200190565b5f604051808303815f87803b15801562004773575f80fd5b505af115801562004786573d5f803e3d5ffd5b5050855473ffffffffffffffffffffffffffffffffffffffff165f908152608260209081526040918290205460028701546001880154845167ffffffffffffffff898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562004882575f80fd5b505af115801562004895573d5f803e3d5ffd5b505050506200195662005301565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620019dc575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620019dc575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b67ffffffffffffffff8086165f818152600389016020526040808220549388168252902054606092911580159062004a4f575081155b1562004a87576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8062004abf576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62004aca8462005394565b62004b01576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b885460018a01546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b821660748401527401000000000000000000000000000000000000000094859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62004bec8362003ad1565b9050815f8062004bfd84846200603b565b60855467ffffffffffffffff91821692505f9162004c299168010000000000000000900416426200616c565b90505b8467ffffffffffffffff168467ffffffffffffffff161462004cbc5767ffffffffffffffff8085165f9081526003890160205260409020600181015490911682101562004c9657600181015468010000000000000000900467ffffffffffffffff16945062004cb5565b62004ca286866200603b565b67ffffffffffffffff1693505062004cbc565b5062004c2c565b5f62004cc984846200616c565b90508381101562004d2757808403600c811162004ce7578062004cea565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004d1c5762004d1c62006096565b046086555062004d9e565b838103600c811162004d3a578062004d3d565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004d765762004d7662006096565b04905080608654670de0b6b3a7640000028162004d975762004d9762006096565b0460865550505b683635c9adc5dea00000608654111562004dc557683635c9adc5dea0000060865562004ddd565b633b9aca00608654101562004ddd57633b9aca006086555b5050505050505050565b600681015467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116700100000000000000000000000000000000909204161115620036415760068101545f9062004e6a907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600162005f1f565b905062004e78828262003a8b565b15620019dc5760068201545f9060029062004eb3908490700100000000000000000000000000000000900467ffffffffffffffff166200603b565b62004ebf919062006301565b62004ecb908362005f1f565b905062004ed9838262003a8b565b1562004eeb5762001742838262004598565b62001742838362004598565b606f5460ff1662004f34576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062004fa19063ffffffff1662005f64565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f8767ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858260010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555086826001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084825f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620051f695949392919067ffffffffffffffff958616815273ffffffffffffffffffffffffffffffffffffffff949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620019dc576040517fec2b7c3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052620017429084906200541b565b606f5460ff16156200533f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff0000000167ffffffffffffffff8316108015620053cc575067ffffffff00000001604083901c67ffffffffffffffff16105b8015620053ee575067ffffffff00000001608083901c67ffffffffffffffff16105b801562005406575067ffffffff0000000160c083901c105b156200541457506001919050565b505f919050565b5f6200547e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200552d9092919063ffffffff16565b8051909150156200174257808060200190518101906200549f9190620062e0565b62001742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000de8565b60606200553d84845f8562005545565b949350505050565b606082471015620055d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840162000de8565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405162005603919062006287565b5f6040518083038185875af1925050503d805f81146200563f576040519150601f19603f3d011682016040523d82523d5f602084013e62005644565b606091505b50915091506200221d8783838760608315620056eb5782515f03620056e35773ffffffffffffffffffffffffffffffffffffffff85163b620056e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000de8565b50816200553d565b6200553d8383815115620057025781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000de8919062005ce7565b610a5e806200632b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811462003641575f80fd5b803567ffffffffffffffff8116811462003b62575f80fd5b5f805f805f805f805f806101408b8d0312156200579b575f80fd5b8a35620057a88162005746565b9950620057b860208c0162005768565b9850620057c860408c0162005768565b975060608b0135620057da8162005746565b965060808b0135620057ec8162005746565b955060a08b0135620057fe8162005746565b945060c08b0135620058108162005746565b935060e08b0135620058228162005746565b9250620058336101008c0162005768565b9150620058446101208c0162005768565b90509295989b9194979a5092959850565b803563ffffffff8116811462003b62575f80fd5b5f80604083850312156200587b575f80fd5b620058868362005855565b9150620058966020840162005768565b90509250929050565b5f60208284031215620058b0575f80fd5b620012448262005855565b80610300810183101562001247575f80fd5b5f805f805f805f806103e0898b031215620058e6575f80fd5b620058f18962005855565b97506200590160208a0162005768565b96506200591160408a0162005768565b95506200592160608a0162005768565b94506200593160808a0162005768565b935060a0890135925060c08901359150620059508a60e08b01620058bb565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562005978575f80fd5b620059838962005855565b97506200599360208a0162005768565b9650620059a360408a0162005768565b9550620059b360608a0162005768565b94506080890135935060a0890135925060c0890135620059d38162005746565b9150620059508a60e08b01620058bb565b5f60208284031215620059f5575f80fd5b813561ffff8116811462005a07575f80fd5b9392505050565b5f6020828403121562005a1f575f80fd5b5035919050565b5f806040838503121562005a38575f80fd5b82359150602083013562005a4c8162005746565b809150509250929050565b5f6020828403121562005a68575f80fd5b620012448262005768565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f83011262005ab0575f80fd5b813567ffffffffffffffff8082111562005ace5762005ace62005a73565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562005b175762005b1762005a73565b8160405283815286602085880101111562005b30575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562005b66575f80fd5b62005b718862005855565b965062005b816020890162005768565b9550604088013562005b938162005746565b9450606088013562005ba58162005746565b9350608088013562005bb78162005746565b925060a088013567ffffffffffffffff8082111562005bd4575f80fd5b62005be28b838c0162005aa0565b935060c08a013591508082111562005bf8575f80fd5b5062005c078a828b0162005aa0565b91505092959891949750929550565b5f805f805f8060c0878903121562005c2c575f80fd5b62005c378762005855565b955062005c476020880162005768565b945062005c576040880162005768565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562005c9457818101518382015260200162005c7a565b50505f910152565b5f815180845262005cb581602086016020860162005c78565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f62001244602083018462005c9c565b5f806040838503121562005d0d575f80fd5b62005d188362005768565b946020939093013593505050565b5f805f806060858703121562005d3a575f80fd5b843562005d478162005746565b935062005d576020860162005855565b9250604085013567ffffffffffffffff8082111562005d74575f80fd5b818701915087601f83011262005d88575f80fd5b81358181111562005d97575f80fd5b88602082850101111562005da9575f80fd5b95989497505060200194505050565b5f6020828403121562005dc9575f80fd5b813562005a078162005746565b803560ff8116811462003b62575f80fd5b5f805f805f8060c0878903121562005dfd575f80fd5b863562005e0a8162005746565b9550602087013562005e1c8162005746565b945062005e2c6040880162005768565b935062005e3c6060880162005768565b92506080870135915062005e5360a0880162005dd6565b90509295509295509295565b5f805f805f8060c0878903121562005e75575f80fd5b863562005e828162005746565b9550602087013562005e948162005746565b945062005ea46040880162005768565b935062005eb46060880162005dd6565b92506080870135915060a087013567ffffffffffffffff81111562005ed7575f80fd5b62005ee589828a0162005aa0565b9150509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111562005f435762005f4362005ef2565b5092915050565b808202811582820484141762001247576200124762005ef2565b5f63ffffffff80831681810362005f7f5762005f7f62005ef2565b6001019392505050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015262005fc3606083018462005c9c565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200601a60c083018562005c9c565b82810360a08401526200602e818562005c9c565b9998505050505050505050565b67ffffffffffffffff82811682821603908082111562005f435762005f4362005ef2565b5f67ffffffffffffffff80831681810362005f7f5762005f7f62005ef2565b5f602082840312156200608f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82620060d457620060d462006096565b500490565b8082018082111562001247576200124762005ef2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200614f576200614f62005ef2565b5060010190565b5f8262006167576200616762006096565b500690565b8181038181111562001247576200124762005ef2565b5f8162006193576200619362005ef2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b73ffffffffffffffffffffffffffffffffffffffff8416815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525067ffffffffffffffff8616604083015260ff8516606083015283608083015260c060a08301526200627b60c083018462005c9c565b98975050505050505050565b5f82516200629a81846020870162005c78565b9190910192915050565b6103208101610300808584378201835f5b6001811015620062d6578151835260209283019290910190600101620062b5565b5050509392505050565b5f60208284031215620062f1575f80fd5b8151801515811462005a07575f80fd5b5f67ffffffffffffffff808416806200631e576200631e62006096565b9216919091049291505056fe60a060405260405162000a5e38038062000a5e833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f8051602062000a3e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f8051602062000a3e83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b6080516105ba620004845f395f601001526105ba5ff3fe608060405261000c61000e565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633036100a7575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef286000000000000000000000000000000000000000000000000000000001461009f5761009d6100ab565b565b61009d6100bb565b61009d5b61009d6100b66100e9565b61012d565b5f806100ca3660048184610410565b8101906100d79190610464565b915091506100e5828261014b565b5050565b5f6101287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b365f80375f80365f845af43d5f803e808015610147573d5ff35b3d5ffd5b610154826101b2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101aa576101a58282610285565b505050565b6100e5610304565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361021f576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516102ae9190610558565b5f60405180830381855af49150503d805f81146102e6576040519150601f19603f3d011682016040523d82523d5f602084013e6102eb565b606091505b50915091506102fb85838361033c565b95945050505050565b341561009d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103515761034c826103ce565b6103c7565b8151158015610375575073ffffffffffffffffffffffffffffffffffffffff84163b155b156103c4576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610216565b50805b9392505050565b8051156103de5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808585111561041e575f80fd5b8386111561042a575f80fd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610475575f80fd5b823573ffffffffffffffffffffffffffffffffffffffff81168114610498575f80fd5b9150602083013567ffffffffffffffff808211156104b4575f80fd5b818501915085601f8301126104c7575f80fd5b8135818111156104d9576104d9610437565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561051f5761051f610437565b81604052828152886020848701011115610537575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610577576020818601810151858301520161055d565b505f92019182525091905056fea26469706673582212200ca61bd1e45d482203caba1d216b11bb6992f1ce0f6427bfe86e65b2f53457a264736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212201a2ae2d730801f81f42936329f636b8afe39749919cb9dab4748bf0eae19efe364736f6c63430008140033",
- "deployedBytecode": "0x608060405234801562000010575f80fd5b50600436106200038c575f3560e01c8063841b24d711620001e3578063c1acbc341162000113578063dbc1697611620000ab578063e46761c41162000083578063e46761c41462000b84578063f34eb8eb1462000bac578063f4e926751462000bc3578063f9c4c2ae1462000bd4575f80fd5b8063dbc169761462000b42578063dde0ff771462000b4c578063e0bfd3d21462000b6d575f80fd5b8063d02103ca11620000eb578063d02103ca1462000ad7578063d5073f6f1462000aff578063d547741f1462000b16578063d939b3151462000b2d575f80fd5b8063c1acbc341462000a6f578063c4c928c21462000a98578063ceee281d1462000aaf575f80fd5b80639c9f3dfe1162000187578063a2967d99116200015f578063a2967d9914620008ff578063a3c573eb1462000909578063afd23cbe1462000957578063b99d0ad7146200098e575f80fd5b80639c9f3dfe14620008c9578063a066215c14620008e0578063a217fddf14620008f7575f80fd5b806391d1485411620001bb57806391d14854146200086057806399f5634e14620008a85780639a908e7314620008b2575f80fd5b8063841b24d7146200080157806387c20c0114620008325780638bd4f0711462000849575f80fd5b80632528016911620002bf57806355a71ee011620002635780637222020f116200023b5780637222020f1462000785578063727885e9146200079c5780637975fcfe14620007b35780637fb6e76a14620007d9575f80fd5b806355a71ee0146200062957806360469169146200066d57806365c0504d1462000677575f80fd5b806336568abe116200029757806336568abe14620005f2578063394218e91462000609578063477fa2701462000620575f80fd5b806325280169146200050b5780632f2ff15d14620005c657806330c27dde14620005dd575f80fd5b80631489ed1011620003335780631796a1ae116200030b5780631796a1ae146200048f5780631816b7e514620004b65780632072f6c514620004cd578063248a9ca314620004d7575f80fd5b80631489ed10146200045357806315064c96146200046a5780631608859c1462000478575f80fd5b80630a0d9fbe11620003675780630a0d9fbe146200040457806311f6b287146200042557806312b86e19146200043c575f80fd5b80630645af091462000390578063066ec01214620003a9578063080b311114620003dc575b5f80fd5b620003a7620003a136600462005780565b62000d3e565b005b608454620003be9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b620003f3620003ed36600462005869565b62001224565b6040519015158152602001620003d3565b608554620003be9068010000000000000000900467ffffffffffffffff1681565b620003be620004363660046200589f565b6200124d565b620003a76200044d366004620058cd565b6200126c565b620003a7620004643660046200595f565b6200148c565b606f54620003f39060ff1681565b620003a76200048936600462005869565b6200166b565b607e54620004a09063ffffffff1681565b60405163ffffffff9091168152602001620003d3565b620003a7620004c7366004620059e4565b62001747565b620003a762001844565b620004fc620004e836600462005a0e565b5f9081526034602052604090206001015490565b604051908152602001620003d3565b620005916200051c36600462005869565b60408051606080820183525f808352602080840182905292840181905263ffffffff9590951685526081825282852067ffffffffffffffff9485168652600301825293829020825194850183528054855260010154808416918501919091526801000000000000000090049091169082015290565b604080518251815260208084015167ffffffffffffffff908116918301919091529282015190921690820152606001620003d3565b620003a7620005d736600462005a26565b62001958565b608754620003be9067ffffffffffffffff1681565b620003a76200060336600462005a26565b62001980565b620003a76200061a36600462005a57565b620019e0565b608654620004fc565b620004fc6200063a36600462005869565b63ffffffff82165f90815260816020908152604080832067ffffffffffffffff8516845260020190915290205492915050565b620004fc62001afb565b6200072d620006883660046200589f565b607f6020525f908152604090208054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff918216929182169167ffffffffffffffff740100000000000000000000000000000000000000008204169160ff7c010000000000000000000000000000000000000000000000000000000083048116927d0100000000000000000000000000000000000000000000000000000000009004169086565b6040805173ffffffffffffffffffffffffffffffffffffffff978816815296909516602087015267ffffffffffffffff9093169385019390935260ff166060840152901515608083015260a082015260c001620003d3565b620003a7620007963660046200589f565b62001b12565b620003a7620007ad36600462005b4f565b62001c8d565b620007ca620007c436600462005c16565b620021f6565b604051620003d3919062005ce7565b620004a0620007ea36600462005a57565b60836020525f908152604090205463ffffffff1681565b608454620003be907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b620003a7620008433660046200595f565b62002228565b620003a76200085a366004620058cd565b62002625565b620003f36200087136600462005a26565b5f91825260346020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b620004fc620026f6565b620003be620008c336600462005cfb565b62002804565b620003a7620008da36600462005a57565b62002a54565b620003a7620008f136600462005a57565b62002b3d565b620004fc5f81565b620004fc62002c27565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620003d3565b6085546200097a90700100000000000000000000000000000000900461ffff1681565b60405161ffff9091168152602001620003d3565b62000a296200099f36600462005869565b60408051608080820183525f8083526020808401829052838501829052606093840182905263ffffffff9690961681526081865283812067ffffffffffffffff958616825260040186528390208351918201845280548086168352680100000000000000009004909416948101949094526001830154918401919091526002909101549082015290565b604051620003d391905f60808201905067ffffffffffffffff80845116835280602085015116602084015250604083015160408301526060830151606083015292915050565b608454620003be90700100000000000000000000000000000000900467ffffffffffffffff1681565b620003a762000aa936600462005d26565b6200300f565b620004a062000ac036600462005db8565b60826020525f908152604090205463ffffffff1681565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000b1036600462005a0e565b6200345d565b620003a762000b2736600462005a26565b62003512565b608554620003be9067ffffffffffffffff1681565b620003a76200353a565b608454620003be9068010000000000000000900467ffffffffffffffff1681565b620003a762000b7e36600462005de7565b62003644565b620009317f000000000000000000000000000000000000000000000000000000000000000081565b620003a762000bbd36600462005e5f565b62003758565b608054620004a09063ffffffff1681565b62000cb062000be53660046200589f565b60816020525f90815260409020805460018201546005830154600684015460079094015473ffffffffffffffffffffffffffffffffffffffff80851695740100000000000000000000000000000000000000009586900467ffffffffffffffff908116969286169592909204821693928282169268010000000000000000808404821693700100000000000000000000000000000000808204841694780100000000000000000000000000000000000000000000000090920484169380831693830416910460ff168c565b6040805173ffffffffffffffffffffffffffffffffffffffff9d8e16815267ffffffffffffffff9c8d1660208201529c909a16998c019990995296891660608b015260808a019590955292871660a089015290861660c0880152851660e0870152841661010086015283166101208501529190911661014083015260ff1661016082015261018001620003d3565b5f54600290610100900460ff1615801562000d5f57505f5460ff8083169116105b62000df1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805461010060ff84167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921691909117179055608580546084805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8e8116919091029190911790915567016345785d8a00006086558c167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116176907080000000000000000177fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff167103ea0000000000000000000000000000000017905562000efa6200399d565b62000f267f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c62003a35565b62000f325f8862003a35565b62000f5e7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f5908862003a35565b62000f8a7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e8862003a35565b62000fb67f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac8862003a35565b62000fe27fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd8962003a35565b6200100e7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd088962003a35565b6200103a7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f48962003a35565b620010667fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db18962003a35565b620010b27f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f062003a41565b620010de7f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f08962003a35565b6200110a7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb8962003a35565b620011567f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595162003a41565b620011827f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e8762003a35565b620011ae7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff2859518762003a35565b620011ba5f3362003a35565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff82165f90815260816020526040812062001244908362003a8b565b90505b92915050565b63ffffffff81165f908152608160205260408120620012479062003ad1565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620012988162003b67565b63ffffffff89165f908152608160205260409020620012be818a8a8a8a8a8a8a62003b73565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8981169182029290921783555f90815260028401602052604090208690556005830187905590547001000000000000000000000000000000009004161562001356576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200139c62002c27565b6040518263ffffffff1660e01b8152600401620013bb91815260200190565b5f604051808303815f87803b158015620013d3575f80fd5b505af1158015620013e6573d5f803e3d5ffd5b50506084805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a8000000000000000000000000000000000000000000000000017905550506040805167ffffffffffffffff881681526020810186905290810186905233606082015263ffffffff8b16907f3182bd6e6f74fc1fdc88b60f3a4f4c7f79db6ae6f5b88a1b3f5a1e28ec210d5e9060800160405180910390a250505050505050505050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620014b88162003b67565b63ffffffff89165f908152608160205260409020620014de818a8a8a8a8a8a8a62004052565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8a81169182029290921783555f90815260028401602052604090208790556005830188905590547001000000000000000000000000000000009004161562001576576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d620015bc62002c27565b6040518263ffffffff1660e01b8152600401620015db91815260200190565b5f604051808303815f87803b158015620015f3575f80fd5b505af115801562001606573d5f803e3d5ffd5b50506040805167ffffffffffffffff8b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b63ffffffff82165f9081526081602090815260408083203384527fc17b14a573f65366cdad721c7c0a0f76536bb4a86b935cdac44610e4f010b52a9092529091205460ff166200173657606f5460ff1615620016f3576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ff818362003a8b565b62001736576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62001742818362004598565b505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db1620017738162003b67565b6103e88261ffff1610806200178d57506103ff8261ffff16115b15620017c5576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000061ffff8516908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a15050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200194c57608454700100000000000000000000000000000000900467ffffffffffffffff161580620018e257506084544290620018d69062093a8090700100000000000000000000000000000000900467ffffffffffffffff1662005f1f565b67ffffffffffffffff16115b806200191457506087544290620019089062093a809067ffffffffffffffff1662005f1f565b67ffffffffffffffff16115b156200194c576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620019566200481c565b565b5f82815260346020526040902060010154620019748162003b67565b620017428383620048a3565b73ffffffffffffffffffffffffffffffffffffffff81163314620019d0576040517f5a568e6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620019dc82826200495f565b5050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162001a0c8162003b67565b606f5460ff1662001a7d5760845467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169083161062001a7d576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6084805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8516908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a19060200162001838565b5f608654606462001b0d919062005f4a565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd62001b3e8162003b67565b63ffffffff8216158062001b5d5750607e5463ffffffff908116908316115b1562001b95576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff161515900362001c0e576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810180547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000017905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0862001cb98162003b67565b63ffffffff8816158062001cd85750607e5463ffffffff908116908916115b1562001d10576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff161515900362001d89576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f9081526083602052604090205463ffffffff161562001de0576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f9190829062001dfa9063ffffffff1662005f64565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f808252602082019283905293945073ffffffffffffffffffffffffffffffffffffffff90921691309162001e549062005738565b62001e629392919062005f89565b604051809103905ff08015801562001e7c573d5f803e3d5ffd5b5090508160835f8c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360010160149054906101000a900467ffffffffffffffff168160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360020154816002015f8067ffffffffffffffff1681526020019081526020015f20819055508b63ffffffff168160070160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff021916908360ff1602179055508263ffffffff167f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6418d848e8c60405162002153949392919063ffffffff94909416845273ffffffffffffffffffffffffffffffffffffffff928316602085015267ffffffffffffffff91909116604084015216606082015260800190565b60405180910390a26040517f7125702200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690637125702290620021b9908d908d9088908e908e908e9060040162005fcc565b5f604051808303815f87803b158015620021d1575f80fd5b505af1158015620021e4573d5f803e3d5ffd5b50505050505050505050505050505050565b63ffffffff86165f9081526081602052604090206060906200221d90878787878762004a19565b979650505050505050565b606f5460ff161562002266576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f90815260816020908152604080832060845467ffffffffffffffff8a811686526003830190945291909320600101544292620022ca92780100000000000000000000000000000000000000000000000090048116911662005f1f565b67ffffffffffffffff1611156200230d576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e86200231c88886200603b565b67ffffffffffffffff1611156200235f576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002371818989898989898962004052565b6200237d818762004be0565b60855467ffffffffffffffff165f03620024c3576006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8981169182029290921783555f90815260028401602052604090208690556005830187905590547001000000000000000000000000000000009004161562002429576006810180546fffffffffffffffffffffffffffffffff1690555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200246f62002c27565b6040518263ffffffff1660e01b81526004016200248e91815260200190565b5f604051808303815f87803b158015620024a6575f80fd5b505af1158015620024b9573d5f803e3d5ffd5b50505050620025c5565b620024ce8162004de7565b600681018054700100000000000000000000000000000000900467ffffffffffffffff1690601062002500836200605f565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815289831660208083019182528284018b8152606084018b81526006890154700100000000000000000000000000000000900487165f90815260048a0190935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b6040805167ffffffffffffffff8816815260208101869052908101869052339063ffffffff8b16907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600160405180910390a3505050505050505050565b606f5460ff161562002663576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f90815260816020526040902062002689818989898989898962003b73565b67ffffffffffffffff87165f9081526004820160209081526040918290206002015482519081529081018590527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a1620026eb6200481c565b505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801562002783573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620027a991906200607e565b6084549091505f90620027d59067ffffffffffffffff680100000000000000008204811691166200603b565b67ffffffffffffffff169050805f03620027f1575f9250505090565b620027fd8183620060c3565b9250505090565b606f545f9060ff161562002844576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526082602052604081205463ffffffff169081900362002894576040517f71653c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8367ffffffffffffffff165f03620028d8576040517f2590ccf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200290b90849067ffffffffffffffff1662005f1f565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560068301541690505f62002941878362005f1f565b60068401805467ffffffffffffffff8084167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217909255604080516060810182528a815242841660208083019182528886168385019081525f95865260038b019091529290932090518155915160019290920180549151841668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009092169290931691909117179055905062002a058362004de7565b60405167ffffffffffffffff8216815263ffffffff8516907f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a259060200160405180910390a29695505050505050565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002a808162003b67565b606f5460ff1662002ad55760855467ffffffffffffffff9081169083161062002ad5576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff84169081179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c759060200162001838565b7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db162002b698162003b67565b620151808267ffffffffffffffff16111562002bb1576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8516908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c289060200162001838565b6080545f9063ffffffff1680820362002c4157505f919050565b5f8167ffffffffffffffff81111562002c5e5762002c5e62005a73565b60405190808252806020026020018201604052801562002c88578160200160208202803683370190505b5090505f5b8281101562002cf85760815f62002ca6836001620060d9565b63ffffffff1663ffffffff1681526020019081526020015f206005015482828151811062002cd85762002cd8620060ef565b60209081029190910101528062002cef816200611c565b91505062002c8d565b505f60205b8360011462002f51575f62002d1460028662006156565b62002d21600287620060c3565b62002d2d9190620060d9565b90505f8167ffffffffffffffff81111562002d4c5762002d4c62005a73565b60405190808252806020026020018201604052801562002d76578160200160208202803683370190505b5090505f5b8281101562002efd5762002d916001846200616c565b8114801562002dac575062002da860028862006156565b6001145b1562002e34578562002dc082600262005f4a565b8151811062002dd35762002dd3620060ef565b60200260200101518560405160200162002df7929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002e225762002e22620060ef565b60200260200101818152505062002ee8565b8562002e4282600262005f4a565b8151811062002e555762002e55620060ef565b60200260200101518682600262002e6d919062005f4a565b62002e7a906001620060d9565b8151811062002e8d5762002e8d620060ef565b602002602001015160405160200162002eb0929190918252602082015260400190565b6040516020818303038152906040528051906020012082828151811062002edb5762002edb620060ef565b6020026020010181815250505b8062002ef4816200611c565b91505062002d7b565b50809450819550838460405160200162002f21929190918252602082015260400190565b604051602081830303815290604052805190602001209350828062002f469062006182565b935050505062002cfd565b5f835f8151811062002f675762002f67620060ef565b602002602001015190505f5b8281101562003005576040805160208101849052908101859052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002ffc906200611c565b91505062002f73565b5095945050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac6200303b8162003b67565b63ffffffff841615806200305a5750607e5463ffffffff908116908516115b1562003092576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f9081526082602052604081205463ffffffff1690819003620030f8576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8181165f9081526081602052604090206007810154909187166801000000000000000090910467ffffffffffffffff160362003165576040517f4f61d51900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff86165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620031de576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018101546007830154700100000000000000000000000000000000900460ff9081167c010000000000000000000000000000000000000000000000000000000090920416146200325b576040517fb541abe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808201805491840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9094169384178255915467ffffffffffffffff740100000000000000000000000000000000000000009182900416027fffffffff000000000000000000000000000000000000000000000000000000009092169092171790556007820180546801000000000000000063ffffffff8a16027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790555f62003343846200124d565b6007840180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff831617905582546040517f4f1ef28600000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff8b811692634f1ef28692620033d79216908b908b90600401620061b9565b5f604051808303815f87803b158015620033ef575f80fd5b505af115801562003402573d5f803e3d5ffd5b50506040805163ffffffff8c8116825267ffffffffffffffff86166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a2505050505050505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb620034898162003b67565b683635c9adc5dea00000821180620034a45750633b9aca0082105b15620034dc576040517f8586952500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200162001838565b5f828152603460205260409020600101546200352e8162003b67565b6200174283836200495f565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f4620035668162003b67565b608780547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff16179055604080517fdbc1697600000000000000000000000000000000000000000000000000000000815290517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169163dbc16976916004808301925f92919082900301818387803b15801562003620575f80fd5b505af115801562003633573d5f803e3d5ffd5b505050506200364162004ef7565b50565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e620036708162003b67565b67ffffffffffffffff84165f9081526083602052604090205463ffffffff1615620036c7576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87165f9081526082602052604090205463ffffffff16156200372a576040517fd409b93000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200373b88888888875f62004f86565b5f8080526002909101602052604090209390935550505050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590620037848162003b67565b607e80545f919082906200379e9063ffffffff1662005f64565b91906101000a81548163ffffffff021916908363ffffffff160217905590506040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018767ffffffffffffffff1681526020018660ff1681526020015f1515815260200185815250607f5f8363ffffffff1663ffffffff1681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550606082015181600101601c6101000a81548160ff021916908360ff160217905550608082015181600101601d6101000a81548160ff02191690831515021790555060a082015181600201559050508063ffffffff167fa2970448b3bd66ba7e524e7b2a5b9cf94fa29e32488fb942afdfe70dd4b77b528989898989896040516200398b9695949392919062006222565b60405180910390a25050505050505050565b5f54610100900460ff1662001956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000de8565b620019dc8282620048a3565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b60855467ffffffffffffffff8281165f9081526004850160205260408120549092429262003abe92918116911662005f1f565b67ffffffffffffffff1611159392505050565b60068101545f90700100000000000000000000000000000000900467ffffffffffffffff161562003b445750600681015467ffffffffffffffff70010000000000000000000000000000000090910481165f90815260049092016020526040909120546801000000000000000090041690565b506006015468010000000000000000900467ffffffffffffffff1690565b919050565b62003641813362005209565b60078801545f9067ffffffffffffffff908116908716101562003bc2576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88161562003ca957600689015467ffffffffffffffff7001000000000000000000000000000000009091048116908916111562003c34576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f90815260048a016020526040902060028101548154909288811668010000000000000000909204161462003ca2576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062003d56565b5067ffffffffffffffff85165f9081526002890160205260409020548062003cfd576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600689015467ffffffffffffffff680100000000000000009091048116908716111562003d56576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600689015467ffffffffffffffff7001000000000000000000000000000000009091048116908816118062003d9f57508767ffffffffffffffff168767ffffffffffffffff1611155b8062003dd95750600689015467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690881611155b1562003e11576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260048b01602052604090205468010000000000000000900481169086161462003e76576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003e878a888888868962004a19565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405162003ebd919062006287565b602060405180830381855afa15801562003ed9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003efe91906200607e565b62003f0a919062006156565b60018c01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a9162003f7491889190600401620062a4565b602060405180830381865afa15801562003f90573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003fb69190620062e0565b62003fed576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260048c01602052604090206002015485900362004045576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b5f806200405f8a62003ad1565b60078b015490915067ffffffffffffffff9081169089161015620040af576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff891615620041985760068a015467ffffffffffffffff7001000000000000000000000000000000009091048116908a16111562004121576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff808a165f90815260048c01602052604090206002810154815490945090918a811668010000000000000000909204161462004191576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200423c565b67ffffffffffffffff88165f90815260028b016020526040902054915081620041ed576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168867ffffffffffffffff1611156200423c576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff16116200428a576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200429b8b8a8a8a878b62004a19565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620042d1919062006287565b602060405180830381855afa158015620042ed573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906200431291906200607e565b6200431e919062006156565b60018d01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a916200438891899190600401620062a4565b602060405180830381865afa158015620043a4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620043ca9190620062e0565b62004401576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6200440e848b6200603b565b905062004475878267ffffffffffffffff166200442a620026f6565b62004436919062005f4a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919062005272565b80608460088282829054906101000a900467ffffffffffffffff166200449c919062005f1f565b82546101009290920a67ffffffffffffffff818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000428416021790558e546040517f32c2d153000000000000000000000000000000000000000000000000000000008152918d166004830152602482018b905233604483015273ffffffffffffffffffffffffffffffffffffffff1691506332c2d153906064015f604051808303815f87803b15801562004572575f80fd5b505af115801562004585573d5f803e3d5ffd5b5050505050505050505050505050505050565b600682015467ffffffffffffffff78010000000000000000000000000000000000000000000000009091048116908216111580620045fb5750600682015467ffffffffffffffff7001000000000000000000000000000000009091048116908216115b1562004633576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f818152600485016020908152604080832080546006890180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000092839004909816918202979097178755600280830154828752908a01909452919093209190915560018201546005870155835477ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000909302929092179092557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d6200473c62002c27565b6040518263ffffffff1660e01b81526004016200475b91815260200190565b5f604051808303815f87803b15801562004773575f80fd5b505af115801562004786573d5f803e3d5ffd5b5050855473ffffffffffffffffffffffffffffffffffffffff165f908152608260209081526040918290205460028701546001880154845167ffffffffffffffff898116825294810192909252818501529188166060830152915163ffffffff90921693507f581910eb7a27738945c2f00a91f2284b2d6de9d4e472b12f901c2b0df045e21b925081900360800190a250505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562004882575f80fd5b505af115801562004895573d5f803e3d5ffd5b505050506200195662005301565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620019dc575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620019dc575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b67ffffffffffffffff8086165f818152600389016020526040808220549388168252902054606092911580159062004a4f575081155b1562004a87576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8062004abf576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62004aca8462005394565b62004b01576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b885460018a01546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b821660748401527401000000000000000000000000000000000000000094859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b5f62004bec8362003ad1565b9050815f8062004bfd84846200603b565b60855467ffffffffffffffff91821692505f9162004c299168010000000000000000900416426200616c565b90505b8467ffffffffffffffff168467ffffffffffffffff161462004cbc5767ffffffffffffffff8085165f9081526003890160205260409020600181015490911682101562004c9657600181015468010000000000000000900467ffffffffffffffff16945062004cb5565b62004ca286866200603b565b67ffffffffffffffff1693505062004cbc565b5062004c2c565b5f62004cc984846200616c565b90508381101562004d2757808403600c811162004ce7578062004cea565b600c5b9050806103e80a81608560109054906101000a900461ffff1661ffff160a608654028162004d1c5762004d1c62006096565b046086555062004d9e565b838103600c811162004d3a578062004d3d565b600c5b90505f816103e80a82608560109054906101000a900461ffff1661ffff160a670de0b6b3a7640000028162004d765762004d7662006096565b04905080608654670de0b6b3a7640000028162004d975762004d9762006096565b0460865550505b683635c9adc5dea00000608654111562004dc557683635c9adc5dea0000060865562004ddd565b633b9aca00608654101562004ddd57633b9aca006086555b5050505050505050565b600681015467ffffffffffffffff780100000000000000000000000000000000000000000000000082048116700100000000000000000000000000000000909204161115620036415760068101545f9062004e6a907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16600162005f1f565b905062004e78828262003a8b565b15620019dc5760068201545f9060029062004eb3908490700100000000000000000000000000000000900467ffffffffffffffff166200603b565b62004ebf919062006301565b62004ecb908362005f1f565b905062004ed9838262003a8b565b1562004eeb5762001742838262004598565b62001742838362004598565b606f5460ff1662004f34576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b608080545f918291829062004fa19063ffffffff1662005f64565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f8767ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff16021790555060815f8263ffffffff1663ffffffff1681526020019081526020015f20915087825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858260010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555086826001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084825f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550838260070160106101000a81548160ff021916908360ff1602179055508063ffffffff167fadfc7d56f7e39b08b321534f14bfb135ad27698f7d2f5ad0edc2356ea9a3f850878a888888604051620051f695949392919067ffffffffffffffff958616815273ffffffffffffffffffffffffffffffffffffffff949094166020850152918416604084015260ff166060830152909116608082015260a00190565b60405180910390a2509695505050505050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620019dc576040517fec2b7c3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052620017429084906200541b565b606f5460ff16156200533f576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff0000000167ffffffffffffffff8316108015620053cc575067ffffffff00000001604083901c67ffffffffffffffff16105b8015620053ee575067ffffffff00000001608083901c67ffffffffffffffff16105b801562005406575067ffffffff0000000160c083901c105b156200541457506001919050565b505f919050565b5f6200547e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200552d9092919063ffffffff16565b8051909150156200174257808060200190518101906200549f9190620062e0565b62001742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000de8565b60606200553d84845f8562005545565b949350505050565b606082471015620055d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840162000de8565b5f808673ffffffffffffffffffffffffffffffffffffffff16858760405162005603919062006287565b5f6040518083038185875af1925050503d805f81146200563f576040519150601f19603f3d011682016040523d82523d5f602084013e62005644565b606091505b50915091506200221d8783838760608315620056eb5782515f03620056e35773ffffffffffffffffffffffffffffffffffffffff85163b620056e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000de8565b50816200553d565b6200553d8383815115620057025781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000de8919062005ce7565b610a5e806200632b83390190565b73ffffffffffffffffffffffffffffffffffffffff8116811462003641575f80fd5b803567ffffffffffffffff8116811462003b62575f80fd5b5f805f805f805f805f806101408b8d0312156200579b575f80fd5b8a35620057a88162005746565b9950620057b860208c0162005768565b9850620057c860408c0162005768565b975060608b0135620057da8162005746565b965060808b0135620057ec8162005746565b955060a08b0135620057fe8162005746565b945060c08b0135620058108162005746565b935060e08b0135620058228162005746565b9250620058336101008c0162005768565b9150620058446101208c0162005768565b90509295989b9194979a5092959850565b803563ffffffff8116811462003b62575f80fd5b5f80604083850312156200587b575f80fd5b620058868362005855565b9150620058966020840162005768565b90509250929050565b5f60208284031215620058b0575f80fd5b620012448262005855565b80610300810183101562001247575f80fd5b5f805f805f805f806103e0898b031215620058e6575f80fd5b620058f18962005855565b97506200590160208a0162005768565b96506200591160408a0162005768565b95506200592160608a0162005768565b94506200593160808a0162005768565b935060a0890135925060c08901359150620059508a60e08b01620058bb565b90509295985092959890939650565b5f805f805f805f806103e0898b03121562005978575f80fd5b620059838962005855565b97506200599360208a0162005768565b9650620059a360408a0162005768565b9550620059b360608a0162005768565b94506080890135935060a0890135925060c0890135620059d38162005746565b9150620059508a60e08b01620058bb565b5f60208284031215620059f5575f80fd5b813561ffff8116811462005a07575f80fd5b9392505050565b5f6020828403121562005a1f575f80fd5b5035919050565b5f806040838503121562005a38575f80fd5b82359150602083013562005a4c8162005746565b809150509250929050565b5f6020828403121562005a68575f80fd5b620012448262005768565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f83011262005ab0575f80fd5b813567ffffffffffffffff8082111562005ace5762005ace62005a73565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562005b175762005b1762005a73565b8160405283815286602085880101111562005b30575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a03121562005b66575f80fd5b62005b718862005855565b965062005b816020890162005768565b9550604088013562005b938162005746565b9450606088013562005ba58162005746565b9350608088013562005bb78162005746565b925060a088013567ffffffffffffffff8082111562005bd4575f80fd5b62005be28b838c0162005aa0565b935060c08a013591508082111562005bf8575f80fd5b5062005c078a828b0162005aa0565b91505092959891949750929550565b5f805f805f8060c0878903121562005c2c575f80fd5b62005c378762005855565b955062005c476020880162005768565b945062005c576040880162005768565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b8381101562005c9457818101518382015260200162005c7a565b50505f910152565b5f815180845262005cb581602086016020860162005c78565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f62001244602083018462005c9c565b5f806040838503121562005d0d575f80fd5b62005d188362005768565b946020939093013593505050565b5f805f806060858703121562005d3a575f80fd5b843562005d478162005746565b935062005d576020860162005855565b9250604085013567ffffffffffffffff8082111562005d74575f80fd5b818701915087601f83011262005d88575f80fd5b81358181111562005d97575f80fd5b88602082850101111562005da9575f80fd5b95989497505060200194505050565b5f6020828403121562005dc9575f80fd5b813562005a078162005746565b803560ff8116811462003b62575f80fd5b5f805f805f8060c0878903121562005dfd575f80fd5b863562005e0a8162005746565b9550602087013562005e1c8162005746565b945062005e2c6040880162005768565b935062005e3c6060880162005768565b92506080870135915062005e5360a0880162005dd6565b90509295509295509295565b5f805f805f8060c0878903121562005e75575f80fd5b863562005e828162005746565b9550602087013562005e948162005746565b945062005ea46040880162005768565b935062005eb46060880162005dd6565b92506080870135915060a087013567ffffffffffffffff81111562005ed7575f80fd5b62005ee589828a0162005aa0565b9150509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111562005f435762005f4362005ef2565b5092915050565b808202811582820484141762001247576200124762005ef2565b5f63ffffffff80831681810362005f7f5762005f7f62005ef2565b6001019392505050565b5f73ffffffffffffffffffffffffffffffffffffffff80861683528085166020840152506060604083015262005fc3606083018462005c9c565b95945050505050565b5f73ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200601a60c083018562005c9c565b82810360a08401526200602e818562005c9c565b9998505050505050505050565b67ffffffffffffffff82811682821603908082111562005f435762005f4362005ef2565b5f67ffffffffffffffff80831681810362005f7f5762005f7f62005ef2565b5f602082840312156200608f575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82620060d457620060d462006096565b500490565b8082018082111562001247576200124762005ef2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200614f576200614f62005ef2565b5060010190565b5f8262006167576200616762006096565b500690565b8181038181111562001247576200124762005ef2565b5f8162006193576200619362005ef2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b73ffffffffffffffffffffffffffffffffffffffff8416815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525067ffffffffffffffff8616604083015260ff8516606083015283608083015260c060a08301526200627b60c083018462005c9c565b98975050505050505050565b5f82516200629a81846020870162005c78565b9190910192915050565b6103208101610300808584378201835f5b6001811015620062d6578151835260209283019290910190600101620062b5565b5050509392505050565b5f60208284031215620062f1575f80fd5b8151801515811462005a07575f80fd5b5f67ffffffffffffffff808416806200631e576200631e62006096565b9216919091049291505056fe60a060405260405162000a5e38038062000a5e833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f8051602062000a3e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f8051602062000a3e83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b6080516105ba620004845f395f601001526105ba5ff3fe608060405261000c61000e565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633036100a7575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef286000000000000000000000000000000000000000000000000000000001461009f5761009d6100ab565b565b61009d6100bb565b61009d5b61009d6100b66100e9565b61012d565b5f806100ca3660048184610410565b8101906100d79190610464565b915091506100e5828261014b565b5050565b5f6101287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b365f80375f80365f845af43d5f803e808015610147573d5ff35b3d5ffd5b610154826101b2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101aa576101a58282610285565b505050565b6100e5610304565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361021f576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516102ae9190610558565b5f60405180830381855af49150503d805f81146102e6576040519150601f19603f3d011682016040523d82523d5f602084013e6102eb565b606091505b50915091506102fb85838361033c565b95945050505050565b341561009d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103515761034c826103ce565b6103c7565b8151158015610375575073ffffffffffffffffffffffffffffffffffffffff84163b155b156103c4576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610216565b50805b9392505050565b8051156103de5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808585111561041e575f80fd5b8386111561042a575f80fd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610475575f80fd5b823573ffffffffffffffffffffffffffffffffffffffff81168114610498575f80fd5b9150602083013567ffffffffffffffff808211156104b4575f80fd5b818501915085601f8301126104c7575f80fd5b8135818111156104d9576104d9610437565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561051f5761051f610437565b81604052828152886020848701011115610537575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610577576020818601810151858301520161055d565b505f92019182525091905056fea26469706673582212200ca61bd1e45d482203caba1d216b11bb6992f1ce0f6427bfe86e65b2f53457a264736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a26469706673582212201a2ae2d730801f81f42936329f636b8afe39749919cb9dab4748bf0eae19efe364736f6c63430008140033",
+ "bytecode": "0x60e060405234801562000010575f80fd5b506040516200671c3803806200671c83398101604081905262000033916200013c565b6001600160a01b0380841660805280831660c052811660a0528282826200005962000065565b5050505050506200018d565b5f54610100900460ff1615620000d15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000122575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000139575f80fd5b50565b5f805f606084860312156200014f575f80fd5b83516200015c8162000124565b60208501519093506200016f8162000124565b6040850151909250620001828162000124565b809150509250925092565b60805160a05160c051616533620001e95f395f8181610916015281816123760152613b4901525f81816107b101528181612fae0152613c5e01525f818161087e01528181610f3d015281816132e2015261349801526165335ff3fe608060405234801562000010575f80fd5b506004361062000320575f3560e01c806391d1485411620001a7578063ceee281d11620000ef578063dde0ff77116200009f578063e4a4b6a21162000077578063e4a4b6a21462000938578063f4e92675146200094f578063f9c4c2ae1462000960575f80fd5b8063dde0ff7714620008d8578063dfdb8c5e14620008f9578063e46761c41462000910575f80fd5b8063d5073f6f11620000d3578063d5073f6f14620008a0578063d547741f14620008b7578063dbc1697614620008ce575f80fd5b8063ceee281d1462000850578063d02103ca1462000878575f80fd5b8063a217fddf1162000157578063abcb5198116200012f578063abcb519814620007f9578063c1acbc341462000810578063c4c928c21462000839575f80fd5b8063a217fddf1462000799578063a2967d9914620007a1578063a3c573eb14620007ab575f80fd5b806399f5634e116200018b57806399f5634e14620007615780639a908e73146200076b5780639e36c5651462000782575f80fd5b806391d14854146200070257806397bf07e8146200074a575f80fd5b806336568abe116200026b5780637222020f116200021b5780637975fcfe11620001f35780637975fcfe146200069d5780637fb6e76a14620006c35780638fd88cc214620006eb575f80fd5b80637222020f1462000649578063727885e9146200066057806374d9c2441462000677575f80fd5b806355a71ee0116200024f57806355a71ee0146200052957806360469169146200056d57806365c0504d1462000577575f80fd5b806336568abe1462000509578063477fa2701462000520575f80fd5b80631796a1ae11620002d35780632528016911620002ab5780632528016914620004225780632f2ff15d14620004dd57806330c27dde14620004f4575f80fd5b80631796a1ae14620003bd5780632072f6c514620003e4578063248a9ca314620003ee575f80fd5b806311f6b287116200030757806311f6b28714620003705780631489ed10146200038757806315064c96146200039e575f80fd5b80630645af091462000324578063066ec012146200033d575b5f80fd5b6200033b6200033536600462004af0565b62000986565b005b608454620003529067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b620003526200038136600462004bd9565b62000da9565b6200033b6200039836600462004bfc565b62000dde565b606f54620003ac9060ff1681565b604051901515815260200162000367565b607e54620003ce9063ffffffff1681565b60405163ffffffff909116815260200162000367565b6200033b62001030565b62000413620003ff36600462004c96565b5f9081526034602052604090206001015490565b60405190815260200162000367565b620004a86200043336600462004cae565b60408051606080820183525f808352602080840182905292840181905263ffffffff9590951685526081825282852067ffffffffffffffff9485168652600301825293829020825194850183528054855260010154808416918501919091526801000000000000000090049091169082015290565b604080518251815260208084015167ffffffffffffffff90811691830191909152928201519092169082015260600162000367565b6200033b620004ee36600462004ce4565b62001144565b608754620003529067ffffffffffffffff1681565b6200033b6200051a36600462004ce4565b62001171565b60865462000413565b620004136200053a36600462004cae565b63ffffffff82165f90815260816020908152604080832067ffffffffffffffff8516845260020190915290205492915050565b62000413620011d1565b620006346200058836600462004bd9565b607f6020525f9081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169267ffffffffffffffff740100000000000000000000000000000000000000008404169260ff7c010000000000000000000000000000000000000000000000000000000082048116937d01000000000000000000000000000000000000000000000000000000000090920416919087565b60405162000367979695949392919062004d7c565b6200033b6200065a36600462004bd9565b620011e8565b6200033b6200067136600462004ec4565b62001363565b6200068e6200068836600462004bd9565b6200191b565b60405162000367919062004f8b565b620006b4620006ae366004620050b7565b62001a7e565b60405162000367919062005188565b620003ce620006d43660046200519c565b60836020525f908152604090205463ffffffff1681565b6200033b620006fc366004620051b8565b62001ab0565b620003ac6200071336600462004ce4565b5f91825260346020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6200033b6200075b366004620051e6565b62001f69565b620004136200232f565b620003526200077c36600462005268565b6200243d565b620006b46200079336600462005293565b62002674565b620004135f81565b62000413620026a6565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000367565b6200033b6200080a366004620052cc565b62002a8e565b6084546200035290700100000000000000000000000000000000900467ffffffffffffffff1681565b6200033b6200084a36600462005369565b62002e01565b620003ce62000861366004620053e1565b60826020525f908152604090205463ffffffff1681565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b6200033b620008b136600462004c96565b62002e40565b6200033b620008c836600462004ce4565b62002efb565b6200033b62002f23565b608454620003529068010000000000000000900467ffffffffffffffff1681565b6200033b6200090a366004620053ff565b6200302d565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b6200033b620009493660046200542e565b62003209565b608054620003ce9063ffffffff1681565b620009776200097136600462004bd9565b6200357f565b604051620003679190620054cc565b5f54600290610100900460ff16158015620009a757505f5460ff8083169116105b62000a39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905567016345785d8a000060865562000a7f62003725565b62000aab7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c620037bd565b62000ab75f88620037bd565b62000ae37fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620037bd565b62000b0f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620037bd565b62000b3b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620037bd565b62000b677fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620037bd565b62000b937fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620037bd565b62000bbf7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620037bd565b62000beb7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db189620037bd565b62000c377f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0620037c9565b62000c637f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620037bd565b62000c8f7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620037bd565b62000cdb7f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951620037c9565b62000d077f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e87620037bd565b62000d337f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620037bd565b62000d3f5f33620037bd565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff81165f9081526081602052604081206006015468010000000000000000900467ffffffffffffffff165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462000e0a8162003813565b67ffffffffffffffff88161562000e4d576040517f60dbf8ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154700100000000000000000000000000000000900460ff16600181111562000e925762000e9262004d15565b1462000eca576040517f90db0d0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000edb818989898989896200381f565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8a16908102919091179091555f9081526002820160205260409020859055600581018690557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d62000f81620026a6565b6040518263ffffffff1660e01b815260040162000fa091815260200190565b5f604051808303815f87803b15801562000fb8575f80fd5b505af115801562000fcb573d5f803e3d5ffd5b50506040805167ffffffffffffffff8b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200113857608454700100000000000000000000000000000000900467ffffffffffffffff161580620010ce57506084544290620010c29062093a8090700100000000000000000000000000000000900467ffffffffffffffff166200562e565b67ffffffffffffffff16115b806200110057506087544290620010f49062093a809067ffffffffffffffff166200562e565b67ffffffffffffffff16115b1562001138576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200114262003c5c565b565b5f82815260346020526040902060010154620011608162003813565b6200116c838362003ce3565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314620011c1576040517f5a568e6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011cd828262003d9f565b5050565b5f6086546064620011e3919062005659565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620012148162003813565b63ffffffff82161580620012335750607e5463ffffffff908116908316115b156200126b576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620012e4576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810180547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000017905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200138f8162003813565b63ffffffff88161580620013ae5750607e5463ffffffff908116908916115b15620013e6576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff16151590036200145f576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff67ffffffffffffffff89161115620014a8576040517f4c753f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f9081526083602052604090205463ffffffff1615620014ff576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f91908290620015199063ffffffff1662005673565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f808252602082019283905293945073ffffffffffffffffffffffffffffffffffffffff909216913091620015739062004aa8565b620015819392919062005698565b604051809103905ff0801580156200159b573d5f803e3d5ffd5b5090508160835f8c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360010160149054906101000a900467ffffffffffffffff168160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360020154816002015f8067ffffffffffffffff1681526020019081526020015f20819055508b63ffffffff168160070160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff0219169083600181111562001800576200180062004d15565b0217905550600384015460098201556040805163ffffffff8e8116825273ffffffffffffffffffffffffffffffffffffffff858116602084015267ffffffffffffffff8f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a26040517f7125702200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690637125702290620018de908d908d9088908e908e908e90600401620056d2565b5f604051808303815f87803b158015620018f6575f80fd5b505af115801562001909573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a909820805473ffffffffffffffffffffffffffffffffffffffff8082168c52740100000000000000000000000000000000000000009182900467ffffffffffffffff90811690995260018084015491821690985204871690945260058401549092526006830154808616909152680100000000000000009081900485169091526007820154808516909652850490921690955292939091700100000000000000000000000000000000900460ff169081111562001a4b5762001a4b62004d15565b9081600181111562001a615762001a6162004d15565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f90815260816020526040902060609062001aa590878787878762003e59565b979650505050505050565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff1615801562001b8b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303815f875af115801562001b4c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b72919062005741565b73ffffffffffffffffffffffffffffffffffffffff1614155b1562001bc3576040517f1a06d0fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526082602052604081205463ffffffff169081900362001c29576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154700100000000000000000000000000000000900460ff16600181111562001c6e5762001c6e62004d15565b1462001ca6576040517f90db0d0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600681015467ffffffffffffffff9081169084168111158062001ce65750600682015467ffffffffffffffff680100000000000000009091048116908516105b1562001d1e576040517fcb23ebdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b8467ffffffffffffffff168167ffffffffffffffff161462001df35767ffffffffffffffff8082165f908152600385016020526040902060010154680100000000000000009004811690861681101562001da6576040517f9753965f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff9091165f908152600384016020526040812090815560010180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905562001d20565b6006830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905562001e3585836200575f565b608480545f9062001e5290849067ffffffffffffffff166200575f565b82546101009290920a67ffffffffffffffff81810219909316918316021790915586165f818152600386016020526040908190205490517f669adece0000000000000000000000000000000000000000000000000000000081526004810192909252602482015273ffffffffffffffffffffffffffffffffffffffff8816915063669adece906044015f604051808303815f87803b15801562001ef3575f80fd5b505af115801562001f06573d5f803e3d5ffd5b5050505067ffffffffffffffff85165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62001f958162003813565b67ffffffffffffffff85165f9081526083602052604090205463ffffffff161562001fec576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff67ffffffffffffffff8616111562002035576040517f4c753f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff88165f9081526082602052604090205463ffffffff161562002098576040517fd409b93000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f91908290620020b29063ffffffff1662005673565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555088816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550848160070160106101000a81548160ff0219169083600181111562002290576200229062004d15565b02179055506001856001811115620022ac57620022ac62004d15565b03620022c6576009810184905560058101869055620022d9565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a6040516200231b9695949392919062005783565b60405180910390a250505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620023bc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023e29190620057de565b6084549091505f906200240e9067ffffffffffffffff680100000000000000008204811691166200575f565b67ffffffffffffffff169050805f036200242a575f9250505090565b62002436818362005823565b9250505090565b606f545f9060ff16156200247d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620024cd576040517f71653c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8367ffffffffffffffff165f0362002511576040517f2590ccf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200254490849067ffffffffffffffff166200562e565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560068301541690505f6200257a87836200562e565b60068401805467ffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c01835285902093518455915160019390930180549251871668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200269b90869086868662004020565b90505b949350505050565b6080545f9063ffffffff16808203620026c057505f919050565b5f8167ffffffffffffffff811115620026dd57620026dd62004dde565b60405190808252806020026020018201604052801562002707578160200160208202803683370190505b5090505f5b82811015620027775760815f6200272583600162005839565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200275757620027576200584f565b6020908102919091010152806200276e816200587c565b9150506200270c565b505f60205b83600114620029d0575f62002793600286620058b6565b620027a060028762005823565b620027ac919062005839565b90505f8167ffffffffffffffff811115620027cb57620027cb62004dde565b604051908082528060200260200182016040528015620027f5578160200160208202803683370190505b5090505f5b828110156200297c5762002810600184620058cc565b811480156200282b575062002827600288620058b6565b6001145b15620028b357856200283f82600262005659565b815181106200285257620028526200584f565b60200260200101518560405160200162002876929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028a157620028a16200584f565b60200260200101818152505062002967565b85620028c182600262005659565b81518110620028d457620028d46200584f565b602002602001015186826002620028ec919062005659565b620028f990600162005839565b815181106200290c576200290c6200584f565b60200260200101516040516020016200292f929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200295a576200295a6200584f565b6020026020010181815250505b8062002973816200587c565b915050620027fa565b508094508195508384604051602001620029a0929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029c590620058e2565b93505050506200277c565b5f835f81518110620029e657620029e66200584f565b602002602001015190505f5b8281101562002a84576040805160208101849052908101859052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002a7b906200587c565b915050620029f2565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002aba8162003813565b607e80545f9190829062002ad49063ffffffff1662005673565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060018081111562002b085762002b0862004d15565b86600181111562002b1d5762002b1d62004d15565b0362002b6257841562002b5c576040517f63d722e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002b9b565b821562002b9b576040517f63d722e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018867ffffffffffffffff16815260200187600181111562002c035762002c0362004d15565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f8252918290208451815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825591850151600182810180549588015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090961692909416919091179390931780835593850151909390927fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116907c010000000000000000000000000000000000000000000000000000000090849081111562002d355762002d3562004d15565b021790555060808201516001820180549115157d010000000000000000000000000000000000000000000000000000000000027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002dee908c908c908c908c908c908c908c9062005919565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002e2d8162003813565b62002e3a84848462004137565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002e6c8162003813565b683635c9adc5dea0000082118062002e875750633b9aca0082105b1562002ebf576040517f8586952500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f8281526034602052604090206001015462002f178162003813565b6200116c838362003d9f565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002f4f8162003813565b608780547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff16179055604080517fdbc1697600000000000000000000000000000000000000000000000000000000815290517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169163dbc16976916004808301925f92919082900301818387803b15801562003009575f80fd5b505af11580156200301c573d5f803e3d5ffd5b505050506200302a62004586565b50565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303815f875af11580156200308f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030b5919062005741565b73ffffffffffffffffffffffffffffffffffffffff161462003103576040517f696072e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526082602090815260408083205463ffffffff16835260819091529020600681015467ffffffffffffffff80821668010000000000000000909204161462003191576040517fcc862d4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600781015463ffffffff83166801000000000000000090910467ffffffffffffffff1610620031ec576040517f3e37e23300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080515f8152602081019091526200116c908490849062004137565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620032358162003813565b63ffffffff87165f90815260816020526040902060016007820154700100000000000000000000000000000000900460ff1660018111156200327b576200327b62004d15565b14620032b3576040517f3a64d97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f257b3632000000000000000000000000000000000000000000000000000000008152600481018890527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156200333e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033649190620057de565b5f036200339d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f620033ad89838a8a8a62004020565b600183015460098401546040517f41493c6000000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff909116916341493c6091620034139185908a908a906004016200598a565b5f6040518083038186803b1580156200342a575f80fd5b505afa1580156200343d573d5f803e3d5ffd5b5050608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004267ffffffffffffffff1602179055505060058201879055600882018690557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d620034dc620026a6565b6040518263ffffffff1660e01b8152600401620034fb91815260200190565b5f604051808303815f87803b15801562003513575f80fd5b505af115801562003526573d5f803e3d5ffd5b5050604080515f80825260208201529081018a905233925063ffffffff8c1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a3505050505050505050565b620035e460408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f90815260816020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff8082168652740100000000000000000000000000000000000000009182900467ffffffffffffffff9081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a086015268010000000000000000808204841660c0870152700100000000000000000000000000000000808304851660e088015278010000000000000000000000000000000000000000000000009092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff169081111562003705576200370562004d15565b908160018111156200371b576200371b62004d15565b8152505050919050565b5f54610100900460ff1662001142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000a30565b620011cd828262003ce3565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200302a813362004615565b5f8062003844896006015467ffffffffffffffff680100000000000000009091041690565b60078a015490915067ffffffffffffffff908116908916101562003894576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f90815260028a016020526040902054915081620038e9576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168867ffffffffffffffff16111562003938576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161162003986576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f620039978a8a8a8a878b62003e59565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039cd9190620059f5565b602060405180830381855afa158015620039e9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a0e9190620057de565b62003a1a9190620058b6565b60018c01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a9162003a849189919060040162005a12565b602060405180830381865afa15801562003aa0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ac6919062005a4e565b62003afd576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003b0a848b6200575f565b905062003b71878267ffffffffffffffff1662003b266200232f565b62003b32919062005659565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906200467e565b80608460088282829054906101000a900467ffffffffffffffff1662003b9891906200562e565b82546101009290920a67ffffffffffffffff818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000428416021790558d546040517f32c2d153000000000000000000000000000000000000000000000000000000008152918d166004830152602482018b905233604483015273ffffffffffffffffffffffffffffffffffffffff1691506332c2d15390606401620018de565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003cc2575f80fd5b505af115801562003cd5573d5f803e3d5ffd5b50505050620011426200470d565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620011cd575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620011cd575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b67ffffffffffffffff8086165f818152600389016020526040808220549388168252902054606092911580159062003e8f575081155b1562003ec7576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8062003eff576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62003f0a84620047a0565b62003f41576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b885460018a01546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b821660748401527401000000000000000000000000000000000000000094859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200408f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620040b59190620057de565b60058701546008880154604080516020810193909352820152606081018790527fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff82161580620041565750607e5463ffffffff908116908316115b156200418e576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526082602052604081205463ffffffff1690819003620041f4576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8181165f9081526081602052604090206007810154909185166801000000000000000090910467ffffffffffffffff160362004261576040517f4f61d51900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620042da576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001818101547c0100000000000000000000000000000000000000000000000000000000900460ff169081111562004316576200431662004d15565b6007830154700100000000000000000000000000000000900460ff16600181111562004346576200434662004d15565b146200437e576040517fb541abe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808201805491840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9094169384178255915467ffffffffffffffff740100000000000000000000000000000000000000009182900416027fffffffff00000000000000000000000000000000000000000000000000000000909216909217179055600381015460098301556007820180546801000000000000000063ffffffff8816027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790555f620044708462000da9565b6007840180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff831617905582546040517f4f1ef28600000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff89811692634f1ef2869262004502921690899060040162005a6f565b5f604051808303815f87803b1580156200451a575f80fd5b505af11580156200452d573d5f803e3d5ffd5b50506040805163ffffffff8a8116825267ffffffffffffffff86166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff16620045c3576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620011cd576040517fec2b7c3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526200116c9084906200482c565b606f5460ff16156200474b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff0000000167ffffffffffffffff8316108015620047d8575067ffffffff00000001604083901c67ffffffffffffffff16105b8015620047fa575067ffffffff00000001608083901c67ffffffffffffffff16105b801562004812575067ffffffff0000000160c083901c105b156200482057506001919050565b505f919050565b919050565b5f6200488f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200493e9092919063ffffffff16565b8051909150156200116c5780806020019051810190620048b0919062005a4e565b6200116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000a30565b60606200269e84845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620049739190620059f5565b5f6040518083038185875af1925050503d805f8114620049af576040519150601f19603f3d011682016040523d82523d5f602084013e620049b4565b606091505b509150915062001aa5878383876060831562004a5b5782515f0362004a535773ffffffffffffffffffffffffffffffffffffffff85163b62004a53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000a30565b50816200269e565b6200269e838381511562004a725781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a30919062005188565b610a5e8062005aa083390190565b73ffffffffffffffffffffffffffffffffffffffff811681146200302a575f80fd5b803567ffffffffffffffff8116811462004827575f80fd5b5f805f805f805f805f806101408b8d03121562004b0b575f80fd5b8a3562004b188162004ab6565b995062004b2860208c0162004ad8565b985062004b3860408c0162004ad8565b975060608b013562004b4a8162004ab6565b965060808b013562004b5c8162004ab6565b955060a08b013562004b6e8162004ab6565b945060c08b013562004b808162004ab6565b935060e08b013562004b928162004ab6565b925062004ba36101008c0162004ad8565b915062004bb46101208c0162004ad8565b90509295989b9194979a5092959850565b803563ffffffff8116811462004827575f80fd5b5f6020828403121562004bea575f80fd5b62004bf58262004bc5565b9392505050565b5f805f805f805f806103e0808a8c03121562004c16575f80fd5b62004c218a62004bc5565b985062004c3160208b0162004ad8565b975062004c4160408b0162004ad8565b965062004c5160608b0162004ad8565b955060808a0135945060a08a0135935060c08a013562004c718162004ab6565b92508981018b101562004c82575f80fd5b5060e0890190509295985092959890939650565b5f6020828403121562004ca7575f80fd5b5035919050565b5f806040838503121562004cc0575f80fd5b62004ccb8362004bc5565b915062004cdb6020840162004ad8565b90509250929050565b5f806040838503121562004cf6575f80fd5b82359150602083013562004d0a8162004ab6565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6002811062004d78577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b73ffffffffffffffffffffffffffffffffffffffff88811682528716602082015267ffffffffffffffff8616604082015260e0810162004dc0606083018762004d42565b931515608082015260a081019290925260c090910152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff8084111562004e285762004e2862004dde565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562004e715762004e7162004dde565b8160405280935085815286868601111562004e8a575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f83011262004eb3575f80fd5b62004bf58383356020850162004e0b565b5f805f805f805f60e0888a03121562004edb575f80fd5b62004ee68862004bc5565b965062004ef66020890162004ad8565b9550604088013562004f088162004ab6565b9450606088013562004f1a8162004ab6565b9350608088013562004f2c8162004ab6565b925060a088013567ffffffffffffffff8082111562004f49575f80fd5b62004f578b838c0162004ea3565b935060c08a013591508082111562004f6d575f80fd5b5062004f7c8a828b0162004ea3565b91505092959891949750929550565b815173ffffffffffffffffffffffffffffffffffffffff1681526101808101602083015162004fc6602084018267ffffffffffffffff169052565b50604083015162004fef604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516200500c606084018267ffffffffffffffff169052565b506080830151608083015260a08301516200503360a084018267ffffffffffffffff169052565b5060c08301516200505060c084018267ffffffffffffffff169052565b5060e08301516200506d60e084018267ffffffffffffffff169052565b506101008381015167ffffffffffffffff169083015261012080840151620050988285018262004d42565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c08789031215620050cd575f80fd5b620050d88762004bc5565b9550620050e86020880162004ad8565b9450620050f86040880162004ad8565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620051355781810151838201526020016200511b565b50505f910152565b5f81518084526200515681602086016020860162005119565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f62004bf560208301846200513d565b5f60208284031215620051ad575f80fd5b62004bf58262004ad8565b5f8060408385031215620051ca575f80fd5b823562004ccb8162004ab6565b80356002811062004827575f80fd5b5f805f805f805f60e0888a031215620051fd575f80fd5b87356200520a8162004ab6565b965060208801356200521c8162004ab6565b95506200522c6040890162004ad8565b94506200523c6060890162004ad8565b9350608088013592506200525360a08901620051d7565b915060c0880135905092959891949750929550565b5f80604083850312156200527a575f80fd5b620052858362004ad8565b946020939093013593505050565b5f805f8060808587031215620052a7575f80fd5b620052b28562004bc5565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a031215620052e3575f80fd5b8735620052f08162004ab6565b96506020880135620053028162004ab6565b9550620053126040890162004ad8565b94506200532260608901620051d7565b93506080880135925060a088013567ffffffffffffffff81111562005345575f80fd5b620053538a828b0162004ea3565b92505060c0880135905092959891949750929550565b5f805f606084860312156200537c575f80fd5b8335620053898162004ab6565b9250620053996020850162004bc5565b9150604084013567ffffffffffffffff811115620053b5575f80fd5b8401601f81018613620053c6575f80fd5b620053d78682356020840162004e0b565b9150509250925092565b5f60208284031215620053f2575f80fd5b813562004bf58162004ab6565b5f806040838503121562005411575f80fd5b82356200541e8162004ab6565b915062004cdb6020840162004bc5565b5f805f805f8060a0878903121562005444575f80fd5b6200544f8762004bc5565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8082111562005481575f80fd5b818901915089601f83011262005495575f80fd5b813581811115620054a4575f80fd5b8a6020828501011115620054b6575f80fd5b6020830194508093505050509295509295509295565b815173ffffffffffffffffffffffffffffffffffffffff1681526101808101602083015162005507602084018267ffffffffffffffff169052565b50604083015162005530604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516200554d606084018267ffffffffffffffff169052565b506080830151608083015260a08301516200557460a084018267ffffffffffffffff169052565b5060c08301516200559160c084018267ffffffffffffffff169052565b5060e0830151620055ae60e084018267ffffffffffffffff169052565b506101008381015167ffffffffffffffff9081169184019190915261012080850151821690840152610140808501519091169083015261016080840151620055f98285018262004d42565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111562005652576200565262005601565b5092915050565b808202811582820484141762000dd85762000dd862005601565b5f63ffffffff8083168181036200568e576200568e62005601565b6001019392505050565b5f73ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526200269b60608301846200513d565b5f73ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200572060c08301856200513d565b82810360a08401526200573481856200513d565b9998505050505050505050565b5f6020828403121562005752575f80fd5b815162004bf58162004ab6565b67ffffffffffffffff82811682821603908082111562005652576200565262005601565b67ffffffffffffffff878116825273ffffffffffffffffffffffffffffffffffffffff87166020830152858116604083015260c0820190620057c9606084018762004d42565b93909316608082015260a00152949350505050565b5f60208284031215620057ef575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82620058345762005834620057f6565b500490565b8082018082111562000dd85762000dd862005601565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620058af57620058af62005601565b5060010190565b5f82620058c757620058c7620057f6565b500690565b8181038181111562000dd85762000dd862005601565b5f81620058f357620058f362005601565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b73ffffffffffffffffffffffffffffffffffffffff88811682528716602082015267ffffffffffffffff861660408201525f6200595a606083018762004d42565b84608083015260e060a08301526200597660e08301856200513d565b90508260c083015298975050505050505050565b848152606060208201525f620059a460608301866200513d565b8281036040840152838152838560208301375f6020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011682010191505095945050505050565b5f825162005a0881846020870162005119565b9190910192915050565b6103208101610300808584378201835f5b600181101562005a4457815183526020928301929091019060010162005a23565b5050509392505050565b5f6020828403121562005a5f575f80fd5b8151801515811462004bf5575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6200269e60408301846200513d56fe60a060405260405162000a5e38038062000a5e833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f8051602062000a3e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f8051602062000a3e83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b6080516105ba620004845f395f601001526105ba5ff3fe608060405261000c61000e565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633036100a7575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef286000000000000000000000000000000000000000000000000000000001461009f5761009d6100ab565b565b61009d6100bb565b61009d5b61009d6100b66100e9565b61012d565b5f806100ca3660048184610410565b8101906100d79190610464565b915091506100e5828261014b565b5050565b5f6101287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b365f80375f80365f845af43d5f803e808015610147573d5ff35b3d5ffd5b610154826101b2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101aa576101a58282610285565b505050565b6100e5610304565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361021f576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516102ae9190610558565b5f60405180830381855af49150503d805f81146102e6576040519150601f19603f3d011682016040523d82523d5f602084013e6102eb565b606091505b50915091506102fb85838361033c565b95945050505050565b341561009d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103515761034c826103ce565b6103c7565b8151158015610375575073ffffffffffffffffffffffffffffffffffffffff84163b155b156103c4576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610216565b50805b9392505050565b8051156103de5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808585111561041e575f80fd5b8386111561042a575f80fd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610475575f80fd5b823573ffffffffffffffffffffffffffffffffffffffff81168114610498575f80fd5b9150602083013567ffffffffffffffff808211156104b4575f80fd5b818501915085601f8301126104c7575f80fd5b8135818111156104d9576104d9610437565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561051f5761051f610437565b81604052828152886020848701011115610537575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610577576020818601810151858301520161055d565b505f92019182525091905056fea26469706673582212200ca61bd1e45d482203caba1d216b11bb6992f1ce0f6427bfe86e65b2f53457a264736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a264697066735822122070e0184cb0298270cb77d252235752ad92c48991a113c85600c93d56d7d33b3664736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000320575f3560e01c806391d1485411620001a7578063ceee281d11620000ef578063dde0ff77116200009f578063e4a4b6a21162000077578063e4a4b6a21462000938578063f4e92675146200094f578063f9c4c2ae1462000960575f80fd5b8063dde0ff7714620008d8578063dfdb8c5e14620008f9578063e46761c41462000910575f80fd5b8063d5073f6f11620000d3578063d5073f6f14620008a0578063d547741f14620008b7578063dbc1697614620008ce575f80fd5b8063ceee281d1462000850578063d02103ca1462000878575f80fd5b8063a217fddf1162000157578063abcb5198116200012f578063abcb519814620007f9578063c1acbc341462000810578063c4c928c21462000839575f80fd5b8063a217fddf1462000799578063a2967d9914620007a1578063a3c573eb14620007ab575f80fd5b806399f5634e116200018b57806399f5634e14620007615780639a908e73146200076b5780639e36c5651462000782575f80fd5b806391d14854146200070257806397bf07e8146200074a575f80fd5b806336568abe116200026b5780637222020f116200021b5780637975fcfe11620001f35780637975fcfe146200069d5780637fb6e76a14620006c35780638fd88cc214620006eb575f80fd5b80637222020f1462000649578063727885e9146200066057806374d9c2441462000677575f80fd5b806355a71ee0116200024f57806355a71ee0146200052957806360469169146200056d57806365c0504d1462000577575f80fd5b806336568abe1462000509578063477fa2701462000520575f80fd5b80631796a1ae11620002d35780632528016911620002ab5780632528016914620004225780632f2ff15d14620004dd57806330c27dde14620004f4575f80fd5b80631796a1ae14620003bd5780632072f6c514620003e4578063248a9ca314620003ee575f80fd5b806311f6b287116200030757806311f6b28714620003705780631489ed10146200038757806315064c96146200039e575f80fd5b80630645af091462000324578063066ec012146200033d575b5f80fd5b6200033b6200033536600462004af0565b62000986565b005b608454620003529067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b620003526200038136600462004bd9565b62000da9565b6200033b6200039836600462004bfc565b62000dde565b606f54620003ac9060ff1681565b604051901515815260200162000367565b607e54620003ce9063ffffffff1681565b60405163ffffffff909116815260200162000367565b6200033b62001030565b62000413620003ff36600462004c96565b5f9081526034602052604090206001015490565b60405190815260200162000367565b620004a86200043336600462004cae565b60408051606080820183525f808352602080840182905292840181905263ffffffff9590951685526081825282852067ffffffffffffffff9485168652600301825293829020825194850183528054855260010154808416918501919091526801000000000000000090049091169082015290565b604080518251815260208084015167ffffffffffffffff90811691830191909152928201519092169082015260600162000367565b6200033b620004ee36600462004ce4565b62001144565b608754620003529067ffffffffffffffff1681565b6200033b6200051a36600462004ce4565b62001171565b60865462000413565b620004136200053a36600462004cae565b63ffffffff82165f90815260816020908152604080832067ffffffffffffffff8516845260020190915290205492915050565b62000413620011d1565b620006346200058836600462004bd9565b607f6020525f9081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff928316939282169267ffffffffffffffff740100000000000000000000000000000000000000008404169260ff7c010000000000000000000000000000000000000000000000000000000082048116937d01000000000000000000000000000000000000000000000000000000000090920416919087565b60405162000367979695949392919062004d7c565b6200033b6200065a36600462004bd9565b620011e8565b6200033b6200067136600462004ec4565b62001363565b6200068e6200068836600462004bd9565b6200191b565b60405162000367919062004f8b565b620006b4620006ae366004620050b7565b62001a7e565b60405162000367919062005188565b620003ce620006d43660046200519c565b60836020525f908152604090205463ffffffff1681565b6200033b620006fc366004620051b8565b62001ab0565b620003ac6200071336600462004ce4565b5f91825260346020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b6200033b6200075b366004620051e6565b62001f69565b620004136200232f565b620003526200077c36600462005268565b6200243d565b620006b46200079336600462005293565b62002674565b620004135f81565b62000413620026a6565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000367565b6200033b6200080a366004620052cc565b62002a8e565b6084546200035290700100000000000000000000000000000000900467ffffffffffffffff1681565b6200033b6200084a36600462005369565b62002e01565b620003ce62000861366004620053e1565b60826020525f908152604090205463ffffffff1681565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b6200033b620008b136600462004c96565b62002e40565b6200033b620008c836600462004ce4565b62002efb565b6200033b62002f23565b608454620003529068010000000000000000900467ffffffffffffffff1681565b6200033b6200090a366004620053ff565b6200302d565b620007d37f000000000000000000000000000000000000000000000000000000000000000081565b6200033b620009493660046200542e565b62003209565b608054620003ce9063ffffffff1681565b620009776200097136600462004bd9565b6200357f565b604051620003679190620054cc565b5f54600290610100900460ff16158015620009a757505f5460ff8083169116105b62000a39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905567016345785d8a000060865562000a7f62003725565b62000aab7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd48c620037bd565b62000ab75f88620037bd565b62000ae37fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59088620037bd565b62000b0f7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e88620037bd565b62000b3b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac88620037bd565b62000b677fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd89620037bd565b62000b937fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd0889620037bd565b62000bbf7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f489620037bd565b62000beb7fa5c5790f581d443ed43873ab47cfb8c5d66a6db268e58b5971bb33fc66e07db189620037bd565b62000c377f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd47f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f0620037c9565b62000c637f73cb0569fdbea2544dae03fdb2fe10eda92a72a2e8cd2bd496e85b762505a3f089620037bd565b62000c8f7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb89620037bd565b62000cdb7f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e7f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff285951620037c9565b62000d077f141f8f32ce6198eee741f695cec728bfd32d289f1acf73621fb303581000545e87620037bd565b62000d337f9b6f082d8d3644ae2f24a3c32e356d6f2d9b2844d9b26164fbc82663ff28595187620037bd565b62000d3f5f33620037bd565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050505050505050565b63ffffffff81165f9081526081602052604081206006015468010000000000000000900467ffffffffffffffff165b92915050565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd462000e0a8162003813565b67ffffffffffffffff88161562000e4d576040517f60dbf8ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff89165f908152608160205260408120906007820154700100000000000000000000000000000000900460ff16600181111562000e925762000e9262004d15565b1462000eca576040517f90db0d0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000edb818989898989896200381f565b6006810180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8a16908102919091179091555f9081526002820160205260409020859055600581018690557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d62000f81620026a6565b6040518263ffffffff1660e01b815260040162000fa091815260200190565b5f604051808303815f87803b15801562000fb8575f80fd5b505af115801562000fcb573d5f803e3d5ffd5b50506040805167ffffffffffffffff8b1681526020810189905290810189905233925063ffffffff8d1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a350505050505050505050565b335f9081527f8875b94af5657a2903def9906d67a3f42d8a836d24b5602c00f00fc855339fcd602052604090205460ff166200113857608454700100000000000000000000000000000000900467ffffffffffffffff161580620010ce57506084544290620010c29062093a8090700100000000000000000000000000000000900467ffffffffffffffff166200562e565b67ffffffffffffffff16115b806200110057506087544290620010f49062093a809067ffffffffffffffff166200562e565b67ffffffffffffffff16115b1562001138576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200114262003c5c565b565b5f82815260346020526040902060010154620011608162003813565b6200116c838362003ce3565b505050565b73ffffffffffffffffffffffffffffffffffffffff81163314620011c1576040517f5a568e6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620011cd828262003d9f565b5050565b5f6086546064620011e3919062005659565b905090565b7fab66e11c4f712cd06ab11bf9339b48bef39e12d4a22eeef71d2860a0c90482bd620012148162003813565b63ffffffff82161580620012335750607e5463ffffffff908116908316115b156200126b576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff82165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620012e4576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810180547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167d01000000000000000000000000000000000000000000000000000000000017905560405163ffffffff8416907f4710d2ee567ef1ed6eb2f651dde4589524bcf7cebc62147a99b281cc836e7e44905f90a2505050565b7fa0fab074aba36a6fa69f1a83ee86e5abfb8433966eb57efb13dc2fc2f24ddd086200138f8162003813565b63ffffffff88161580620013ae5750607e5463ffffffff908116908916115b15620013e6576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff88165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff16151590036200145f576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff67ffffffffffffffff89161115620014a8576040517f4c753f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f9081526083602052604090205463ffffffff1615620014ff576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f91908290620015199063ffffffff1662005673565b825463ffffffff8281166101009490940a93840293021916919091179091558254604080515f808252602082019283905293945073ffffffffffffffffffffffffffffffffffffffff909216913091620015739062004aa8565b620015819392919062005698565b604051809103905ff0801580156200159b573d5f803e3d5ffd5b5090508160835f8c67ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508160825f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8463ffffffff1663ffffffff1681526020019081526020015f20905081815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360010160149054906101000a900467ffffffffffffffff168160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508360020154816002015f8067ffffffffffffffff1681526020019081526020015f20819055508b63ffffffff168160070160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600101601c9054906101000a900460ff168160070160106101000a81548160ff0219169083600181111562001800576200180062004d15565b0217905550600384015460098201556040805163ffffffff8e8116825273ffffffffffffffffffffffffffffffffffffffff858116602084015267ffffffffffffffff8f16838501528b1660608301529151918516917f194c983456df6701c6a50830b90fe80e72b823411d0d524970c9590dc277a6419181900360800190a26040517f7125702200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690637125702290620018de908d908d9088908e908e908e90600401620056d2565b5f604051808303815f87803b158015620018f6575f80fd5b505af115801562001909573d5f803e3d5ffd5b50505050505050505050505050505050565b60408051610180810182525f8082526020808301828152838501838152606085018481526080860185815260a0870186815260c0880187815260e089018881526101008a018981526101208b018a81526101408c018b90526101608c018b905263ffffffff8e168b5260819099529a909820805473ffffffffffffffffffffffffffffffffffffffff8082168c52740100000000000000000000000000000000000000009182900467ffffffffffffffff90811690995260018084015491821690985204871690945260058401549092526006830154808616909152680100000000000000009081900485169091526007820154808516909652850490921690955292939091700100000000000000000000000000000000900460ff169081111562001a4b5762001a4b62004d15565b9081600181111562001a615762001a6162004d15565b905250600881015461014083015260090154610160820152919050565b63ffffffff86165f90815260816020526040902060609062001aa590878787878762003e59565b979650505050505050565b335f9081527ff14f5a8ad59d90593602e905b358229bff5ceea677d5bf0f5a1701793550a9a6602052604090205460ff1615801562001b8b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303815f875af115801562001b4c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001b72919062005741565b73ffffffffffffffffffffffffffffffffffffffff1614155b1562001bc3576040517f1a06d0fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526082602052604081205463ffffffff169081900362001c29576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f908152608160205260408120906007820154700100000000000000000000000000000000900460ff16600181111562001c6e5762001c6e62004d15565b1462001ca6576040517f90db0d0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600681015467ffffffffffffffff9081169084168111158062001ce65750600682015467ffffffffffffffff680100000000000000009091048116908516105b1562001d1e576040517fcb23ebdf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805b8467ffffffffffffffff168167ffffffffffffffff161462001df35767ffffffffffffffff8082165f908152600385016020526040902060010154680100000000000000009004811690861681101562001da6576040517f9753965f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff9091165f908152600384016020526040812090815560010180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905562001d20565b6006830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff871617905562001e3585836200575f565b608480545f9062001e5290849067ffffffffffffffff166200575f565b82546101009290920a67ffffffffffffffff81810219909316918316021790915586165f818152600386016020526040908190205490517f669adece0000000000000000000000000000000000000000000000000000000081526004810192909252602482015273ffffffffffffffffffffffffffffffffffffffff8816915063669adece906044015f604051808303815f87803b15801562001ef3575f80fd5b505af115801562001f06573d5f803e3d5ffd5b5050505067ffffffffffffffff85165f81815260038501602090815260409182902054915191825263ffffffff8716917f80a6d395a55aed8126079cb8247f0a6848b1440ca2cdca3b4386f250c3529402910160405180910390a3505050505050565b7f3dfe277d2a2c04b75fb2eb3743fa00005ae3678a20c299e65fdf4df76517f68e62001f958162003813565b67ffffffffffffffff85165f9081526083602052604090205463ffffffff161562001fec576040517f6f91fc1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff67ffffffffffffffff8616111562002035576040517f4c753f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff88165f9081526082602052604090205463ffffffff161562002098576040517fd409b93000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b608080545f91908290620020b29063ffffffff1662005673565b91906101000a81548163ffffffff021916908363ffffffff160217905590508060835f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055508060825f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505f60815f8363ffffffff1663ffffffff1681526020019081526020015f20905089815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550878160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555088816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086815f0160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550848160070160106101000a81548160ff0219169083600181111562002290576200229062004d15565b02179055506001856001811115620022ac57620022ac62004d15565b03620022c6576009810184905560058101869055620022d9565b5f80805260028201602052604090208690555b8163ffffffff167fd490df184152edba8455dac3228134939c71f8cb4c8f310c3145dec9037147ac898c8a895f8a6040516200231b9695949392919062005783565b60405180910390a250505050505050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015620023bc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620023e29190620057de565b6084549091505f906200240e9067ffffffffffffffff680100000000000000008204811691166200575f565b67ffffffffffffffff169050805f036200242a575f9250505090565b62002436818362005823565b9250505090565b606f545f9060ff16156200247d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526082602052604081205463ffffffff1690819003620024cd576040517f71653c1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8367ffffffffffffffff165f0362002511576040517f2590ccf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff81165f90815260816020526040812060848054919287926200254490849067ffffffffffffffff166200562e565b82546101009290920a67ffffffffffffffff81810219909316918316021790915560068301541690505f6200257a87836200562e565b60068401805467ffffffffffffffff8381167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217909255604080516060810182528a815242841660208083019182528886168385019081525f86815260038c01835285902093518455915160019390930180549251871668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169390961692909217179093555190815291925063ffffffff8616917f1d9f30260051d51d70339da239ea7b080021adcaabfa71c9b0ea339a20cf9a25910160405180910390a29695505050505050565b63ffffffff84165f9081526081602052604090206060906200269b90869086868662004020565b90505b949350505050565b6080545f9063ffffffff16808203620026c057505f919050565b5f8167ffffffffffffffff811115620026dd57620026dd62004dde565b60405190808252806020026020018201604052801562002707578160200160208202803683370190505b5090505f5b82811015620027775760815f6200272583600162005839565b63ffffffff1663ffffffff1681526020019081526020015f20600501548282815181106200275757620027576200584f565b6020908102919091010152806200276e816200587c565b9150506200270c565b505f60205b83600114620029d0575f62002793600286620058b6565b620027a060028762005823565b620027ac919062005839565b90505f8167ffffffffffffffff811115620027cb57620027cb62004dde565b604051908082528060200260200182016040528015620027f5578160200160208202803683370190505b5090505f5b828110156200297c5762002810600184620058cc565b811480156200282b575062002827600288620058b6565b6001145b15620028b357856200283f82600262005659565b815181106200285257620028526200584f565b60200260200101518560405160200162002876929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110620028a157620028a16200584f565b60200260200101818152505062002967565b85620028c182600262005659565b81518110620028d457620028d46200584f565b602002602001015186826002620028ec919062005659565b620028f990600162005839565b815181106200290c576200290c6200584f565b60200260200101516040516020016200292f929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106200295a576200295a6200584f565b6020026020010181815250505b8062002973816200587c565b915050620027fa565b508094508195508384604051602001620029a0929190918252602082015260400190565b6040516020818303038152906040528051906020012093508280620029c590620058e2565b93505050506200277c565b5f835f81518110620029e657620029e66200584f565b602002602001015190505f5b8281101562002a84576040805160208101849052908101859052606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018790529082018690529250606001604051602081830303815290604052805190602001209350808062002a7b906200587c565b915050620029f2565b5095945050505050565b7fac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f59062002aba8162003813565b607e80545f9190829062002ad49063ffffffff1662005673565b91906101000a81548163ffffffff021916908363ffffffff1602179055905060018081111562002b085762002b0862004d15565b86600181111562002b1d5762002b1d62004d15565b0362002b6257841562002b5c576040517f63d722e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62002b9b565b821562002b9b576040517f63d722e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e001604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018867ffffffffffffffff16815260200187600181111562002c035762002c0362004d15565b81525f602080830182905260408084018a9052606093840188905263ffffffff86168352607f8252918290208451815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825591850151600182810180549588015167ffffffffffffffff1674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090961692909416919091179390931780835593850151909390927fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116907c010000000000000000000000000000000000000000000000000000000090849081111562002d355762002d3562004d15565b021790555060808201516001820180549115157d010000000000000000000000000000000000000000000000000000000000027fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117905560a0820151600282015560c09091015160039091015560405163ffffffff8216907f9eaf2ecbddb14889c9e141a63175c55ac25e0cd7cdea312cdfbd0397976b383a9062002dee908c908c908c908c908c908c908c9062005919565b60405180910390a2505050505050505050565b7f66156603fe29d13f97c6f3e3dff4ef71919f9aa61c555be0182d954e94221aac62002e2d8162003813565b62002e3a84848462004137565b50505050565b7f8cf807f6970720f8e2c208c7c5037595982c7bd9ed93c380d09df743d0dcc3fb62002e6c8162003813565b683635c9adc5dea0000082118062002e875750633b9aca0082105b1562002ebf576040517f8586952500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60868290556040518281527ffb383653f53ee079978d0c9aff7aeff04a10166ce244cca9c9f9d8d96bed45b29060200160405180910390a15050565b5f8281526034602052604090206001015462002f178162003813565b6200116c838362003d9f565b7f62ba6ba2ffed8cfe316b583325ea41ac6e7ba9e5864d2bc6fabba7ac26d2f0f462002f4f8162003813565b608780547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff16179055604080517fdbc1697600000000000000000000000000000000000000000000000000000000815290517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169163dbc16976916004808301925f92919082900301818387803b15801562003009575f80fd5b505af11580156200301c573d5f803e3d5ffd5b505050506200302a62004586565b50565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b81526004016020604051808303815f875af11580156200308f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620030b5919062005741565b73ffffffffffffffffffffffffffffffffffffffff161462003103576040517f696072e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82165f9081526082602090815260408083205463ffffffff16835260819091529020600681015467ffffffffffffffff80821668010000000000000000909204161462003191576040517fcc862d4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600781015463ffffffff83166801000000000000000090910467ffffffffffffffff1610620031ec576040517f3e37e23300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080515f8152602081019091526200116c908490849062004137565b7f084e94f375e9d647f87f5b2ceffba1e062c70f6009fdbcf80291e803b5c9edd4620032358162003813565b63ffffffff87165f90815260816020526040902060016007820154700100000000000000000000000000000000900460ff1660018111156200327b576200327b62004d15565b14620032b3576040517f3a64d97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f257b3632000000000000000000000000000000000000000000000000000000008152600481018890527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156200333e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620033649190620057de565b5f036200339d576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f620033ad89838a8a8a62004020565b600183015460098401546040517f41493c6000000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff909116916341493c6091620034139185908a908a906004016200598a565b5f6040518083038186803b1580156200342a575f80fd5b505afa1580156200343d573d5f803e3d5ffd5b5050608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004267ffffffffffffffff1602179055505060058201879055600882018690557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166333d6247d620034dc620026a6565b6040518263ffffffff1660e01b8152600401620034fb91815260200190565b5f604051808303815f87803b15801562003513575f80fd5b505af115801562003526573d5f803e3d5ffd5b5050604080515f80825260208201529081018a905233925063ffffffff8c1691507fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d39060600160405180910390a3505050505050505050565b620035e460408051610180810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290529061016082015290565b63ffffffff82165f90815260816020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff8082168652740100000000000000000000000000000000000000009182900467ffffffffffffffff9081169487019490945260018084015491821695870195909552048216606085015260058101546080850152600681015480831660a086015268010000000000000000808204841660c0870152700100000000000000000000000000000000808304851660e088015278010000000000000000000000000000000000000000000000009092048416610100870152600783015480851661012088015290810490931661014086015290926101608501929190910460ff169081111562003705576200370562004d15565b908160018111156200371b576200371b62004d15565b8152505050919050565b5f54610100900460ff1662001142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840162000a30565b620011cd828262003ce3565b5f82815260346020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200302a813362004615565b5f8062003844896006015467ffffffffffffffff680100000000000000009091041690565b60078a015490915067ffffffffffffffff908116908916101562003894576040517fead1340b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff88165f90815260028a016020526040902054915081620038e9576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168867ffffffffffffffff16111562003938576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161162003986576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f620039978a8a8a8a878b62003e59565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051620039cd9190620059f5565b602060405180830381855afa158015620039e9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019062003a0e9190620057de565b62003a1a9190620058b6565b60018c01546040805160208101825283815290517f9121da8a00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff90911691639121da8a9162003a849189919060040162005a12565b602060405180830381865afa15801562003aa0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062003ac6919062005a4e565b62003afd576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62003b0a848b6200575f565b905062003b71878267ffffffffffffffff1662003b266200232f565b62003b32919062005659565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906200467e565b80608460088282829054906101000a900467ffffffffffffffff1662003b9891906200562e565b82546101009290920a67ffffffffffffffff818102199093169183160217909155608480547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000428416021790558d546040517f32c2d153000000000000000000000000000000000000000000000000000000008152918d166004830152602482018b905233604483015273ffffffffffffffffffffffffffffffffffffffff1691506332c2d15390606401620018de565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562003cc2575f80fd5b505af115801562003cd5573d5f803e3d5ffd5b50505050620011426200470d565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620011cd575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615620011cd575f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b67ffffffffffffffff8086165f818152600389016020526040808220549388168252902054606092911580159062003e8f575081155b1562003ec7576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8062003eff576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62003f0a84620047a0565b62003f41576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b885460018a01546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260348101889052605481018590527fffffffffffffffff00000000000000000000000000000000000000000000000060c08c811b821660748401527401000000000000000000000000000000000000000094859004811b8216607c84015293909204831b82166084820152608c810187905260ac810184905260cc81018990529189901b1660ec82015260f401604051602081830303815290604052925050509695505050505050565b60605f855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad1edf346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200408f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620040b59190620057de565b60058701546008880154604080516020810193909352820152606081018790527fffffffff0000000000000000000000000000000000000000000000000000000060e08a901b1660808201526084810182905260a4810186905260c4810185905290915060e40160405160208183030381529060405291505095945050505050565b63ffffffff82161580620041565750607e5463ffffffff908116908316115b156200418e576040517f7512e5cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83165f9081526082602052604081205463ffffffff1690819003620041f4576040517f74a086a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8181165f9081526081602052604090206007810154909185166801000000000000000090910467ffffffffffffffff160362004261576040517f4f61d51900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff84165f908152607f602052604090206001808201547d010000000000000000000000000000000000000000000000000000000000900460ff1615159003620042da576040517f3b8d3d9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001818101547c0100000000000000000000000000000000000000000000000000000000900460ff169081111562004316576200431662004d15565b6007830154700100000000000000000000000000000000900460ff16600181111562004346576200434662004d15565b146200437e576040517fb541abe200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808201805491840180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9094169384178255915467ffffffffffffffff740100000000000000000000000000000000000000009182900416027fffffffff00000000000000000000000000000000000000000000000000000000909216909217179055600381015460098301556007820180546801000000000000000063ffffffff8816027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790555f620044708462000da9565b6007840180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff831617905582546040517f4f1ef28600000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff89811692634f1ef2869262004502921690899060040162005a6f565b5f604051808303815f87803b1580156200451a575f80fd5b505af11580156200452d573d5f803e3d5ffd5b50506040805163ffffffff8a8116825267ffffffffffffffff86166020830152881693507ff585e04c05d396901170247783d3e5f0ee9c1df23072985b50af089f5e48b19d92500160405180910390a250505050505050565b606f5460ff16620045c3576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f82815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16620011cd576040517fec2b7c3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526200116c9084906200482c565b606f5460ff16156200474b576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b5f67ffffffff0000000167ffffffffffffffff8316108015620047d8575067ffffffff00000001604083901c67ffffffffffffffff16105b8015620047fa575067ffffffff00000001608083901c67ffffffffffffffff16105b801562004812575067ffffffff0000000160c083901c105b156200482057506001919050565b505f919050565b919050565b5f6200488f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200493e9092919063ffffffff16565b8051909150156200116c5780806020019051810190620048b0919062005a4e565b6200116c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840162000a30565b60606200269e84845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620049739190620059f5565b5f6040518083038185875af1925050503d805f8114620049af576040519150601f19603f3d011682016040523d82523d5f602084013e620049b4565b606091505b509150915062001aa5878383876060831562004a5b5782515f0362004a535773ffffffffffffffffffffffffffffffffffffffff85163b62004a53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000a30565b50816200269e565b6200269e838381511562004a725781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a30919062005188565b610a5e8062005aa083390190565b73ffffffffffffffffffffffffffffffffffffffff811681146200302a575f80fd5b803567ffffffffffffffff8116811462004827575f80fd5b5f805f805f805f805f806101408b8d03121562004b0b575f80fd5b8a3562004b188162004ab6565b995062004b2860208c0162004ad8565b985062004b3860408c0162004ad8565b975060608b013562004b4a8162004ab6565b965060808b013562004b5c8162004ab6565b955060a08b013562004b6e8162004ab6565b945060c08b013562004b808162004ab6565b935060e08b013562004b928162004ab6565b925062004ba36101008c0162004ad8565b915062004bb46101208c0162004ad8565b90509295989b9194979a5092959850565b803563ffffffff8116811462004827575f80fd5b5f6020828403121562004bea575f80fd5b62004bf58262004bc5565b9392505050565b5f805f805f805f806103e0808a8c03121562004c16575f80fd5b62004c218a62004bc5565b985062004c3160208b0162004ad8565b975062004c4160408b0162004ad8565b965062004c5160608b0162004ad8565b955060808a0135945060a08a0135935060c08a013562004c718162004ab6565b92508981018b101562004c82575f80fd5b5060e0890190509295985092959890939650565b5f6020828403121562004ca7575f80fd5b5035919050565b5f806040838503121562004cc0575f80fd5b62004ccb8362004bc5565b915062004cdb6020840162004ad8565b90509250929050565b5f806040838503121562004cf6575f80fd5b82359150602083013562004d0a8162004ab6565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6002811062004d78577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b73ffffffffffffffffffffffffffffffffffffffff88811682528716602082015267ffffffffffffffff8616604082015260e0810162004dc0606083018762004d42565b931515608082015260a081019290925260c090910152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f67ffffffffffffffff8084111562004e285762004e2862004dde565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562004e715762004e7162004dde565b8160405280935085815286868601111562004e8a575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f83011262004eb3575f80fd5b62004bf58383356020850162004e0b565b5f805f805f805f60e0888a03121562004edb575f80fd5b62004ee68862004bc5565b965062004ef66020890162004ad8565b9550604088013562004f088162004ab6565b9450606088013562004f1a8162004ab6565b9350608088013562004f2c8162004ab6565b925060a088013567ffffffffffffffff8082111562004f49575f80fd5b62004f578b838c0162004ea3565b935060c08a013591508082111562004f6d575f80fd5b5062004f7c8a828b0162004ea3565b91505092959891949750929550565b815173ffffffffffffffffffffffffffffffffffffffff1681526101808101602083015162004fc6602084018267ffffffffffffffff169052565b50604083015162004fef604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516200500c606084018267ffffffffffffffff169052565b506080830151608083015260a08301516200503360a084018267ffffffffffffffff169052565b5060c08301516200505060c084018267ffffffffffffffff169052565b5060e08301516200506d60e084018267ffffffffffffffff169052565b506101008381015167ffffffffffffffff169083015261012080840151620050988285018262004d42565b5050610140838101519083015261016092830151929091019190915290565b5f805f805f8060c08789031215620050cd575f80fd5b620050d88762004bc5565b9550620050e86020880162004ad8565b9450620050f86040880162004ad8565b9350606087013592506080870135915060a087013590509295509295509295565b5f5b83811015620051355781810151838201526020016200511b565b50505f910152565b5f81518084526200515681602086016020860162005119565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f62004bf560208301846200513d565b5f60208284031215620051ad575f80fd5b62004bf58262004ad8565b5f8060408385031215620051ca575f80fd5b823562004ccb8162004ab6565b80356002811062004827575f80fd5b5f805f805f805f60e0888a031215620051fd575f80fd5b87356200520a8162004ab6565b965060208801356200521c8162004ab6565b95506200522c6040890162004ad8565b94506200523c6060890162004ad8565b9350608088013592506200525360a08901620051d7565b915060c0880135905092959891949750929550565b5f80604083850312156200527a575f80fd5b620052858362004ad8565b946020939093013593505050565b5f805f8060808587031215620052a7575f80fd5b620052b28562004bc5565b966020860135965060408601359560600135945092505050565b5f805f805f805f60e0888a031215620052e3575f80fd5b8735620052f08162004ab6565b96506020880135620053028162004ab6565b9550620053126040890162004ad8565b94506200532260608901620051d7565b93506080880135925060a088013567ffffffffffffffff81111562005345575f80fd5b620053538a828b0162004ea3565b92505060c0880135905092959891949750929550565b5f805f606084860312156200537c575f80fd5b8335620053898162004ab6565b9250620053996020850162004bc5565b9150604084013567ffffffffffffffff811115620053b5575f80fd5b8401601f81018613620053c6575f80fd5b620053d78682356020840162004e0b565b9150509250925092565b5f60208284031215620053f2575f80fd5b813562004bf58162004ab6565b5f806040838503121562005411575f80fd5b82356200541e8162004ab6565b915062004cdb6020840162004bc5565b5f805f805f8060a0878903121562005444575f80fd5b6200544f8762004bc5565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8082111562005481575f80fd5b818901915089601f83011262005495575f80fd5b813581811115620054a4575f80fd5b8a6020828501011115620054b6575f80fd5b6020830194508093505050509295509295509295565b815173ffffffffffffffffffffffffffffffffffffffff1681526101808101602083015162005507602084018267ffffffffffffffff169052565b50604083015162005530604084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060608301516200554d606084018267ffffffffffffffff169052565b506080830151608083015260a08301516200557460a084018267ffffffffffffffff169052565b5060c08301516200559160c084018267ffffffffffffffff169052565b5060e0830151620055ae60e084018267ffffffffffffffff169052565b506101008381015167ffffffffffffffff9081169184019190915261012080850151821690840152610140808501519091169083015261016080840151620055f98285018262004d42565b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff81811683821601908082111562005652576200565262005601565b5092915050565b808202811582820484141762000dd85762000dd862005601565b5f63ffffffff8083168181036200568e576200568e62005601565b6001019392505050565b5f73ffffffffffffffffffffffffffffffffffffffff8086168352808516602084015250606060408301526200269b60608301846200513d565b5f73ffffffffffffffffffffffffffffffffffffffff8089168352808816602084015263ffffffff8716604084015280861660608401525060c060808301526200572060c08301856200513d565b82810360a08401526200573481856200513d565b9998505050505050505050565b5f6020828403121562005752575f80fd5b815162004bf58162004ab6565b67ffffffffffffffff82811682821603908082111562005652576200565262005601565b67ffffffffffffffff878116825273ffffffffffffffffffffffffffffffffffffffff87166020830152858116604083015260c0820190620057c9606084018762004d42565b93909316608082015260a00152949350505050565b5f60208284031215620057ef575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82620058345762005834620057f6565b500490565b8082018082111562000dd85762000dd862005601565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620058af57620058af62005601565b5060010190565b5f82620058c757620058c7620057f6565b500690565b8181038181111562000dd85762000dd862005601565b5f81620058f357620058f362005601565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b73ffffffffffffffffffffffffffffffffffffffff88811682528716602082015267ffffffffffffffff861660408201525f6200595a606083018762004d42565b84608083015260e060a08301526200597660e08301856200513d565b90508260c083015298975050505050505050565b848152606060208201525f620059a460608301866200513d565b8281036040840152838152838560208301375f6020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011682010191505095945050505050565b5f825162005a0881846020870162005119565b9190910192915050565b6103208101610300808584378201835f5b600181101562005a4457815183526020928301929091019060010162005a23565b5050509392505050565b5f6020828403121562005a5f575f80fd5b8151801515811462004bf5575f80fd5b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f6200269e60408301846200513d56fe60a060405260405162000a5e38038062000a5e833981016040819052620000269162000375565b828162000034828262000060565b50506001600160a01b038216608052620000576200005160805190565b620000c5565b5050506200046c565b6200006b8262000136565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115620000b757620000b28282620001b5565b505050565b620000c16200022e565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620001065f8051602062000a3e833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620001338162000250565b50565b806001600160a01b03163b5f036200017157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b031684604051620001d391906200044f565b5f60405180830381855af49150503d805f81146200020d576040519150601f19603f3d011682016040523d82523d5f602084013e62000212565b606091505b5090925090506200022585838362000291565b95945050505050565b34156200024e5760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b0381166200027b57604051633173bdd160e11b81525f600482015260240162000168565b805f8051602062000a3e83398151915262000194565b606082620002aa57620002a482620002f7565b620002f0565b8151158015620002c257506001600160a01b0384163b155b15620002ed57604051639996b31560e01b81526001600160a01b038516600482015260240162000168565b50805b9392505050565b805115620003085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80516001600160a01b038116811462000338575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200036d57818101518382015260200162000353565b50505f910152565b5f805f6060848603121562000388575f80fd5b620003938462000321565b9250620003a36020850162000321565b60408501519092506001600160401b0380821115620003c0575f80fd5b818601915086601f830112620003d4575f80fd5b815181811115620003e957620003e96200033d565b604051601f8201601f19908116603f011681019083821181831017156200041457620004146200033d565b816040528281528960208487010111156200042d575f80fd5b6200044083602083016020880162000351565b80955050505050509250925092565b5f82516200046281846020870162000351565b9190910192915050565b6080516105ba620004845f395f601001526105ba5ff3fe608060405261000c61000e565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633036100a7575f357fffffffff00000000000000000000000000000000000000000000000000000000167f4f1ef286000000000000000000000000000000000000000000000000000000001461009f5761009d6100ab565b565b61009d6100bb565b61009d5b61009d6100b66100e9565b61012d565b5f806100ca3660048184610410565b8101906100d79190610464565b915091506100e5828261014b565b5050565b5f6101287f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b365f80375f80365f845af43d5f803e808015610147573d5ff35b3d5ffd5b610154826101b2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101aa576101a58282610285565b505050565b6100e5610304565b8073ffffffffffffffffffffffffffffffffffffffff163b5f0361021f576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60605f808473ffffffffffffffffffffffffffffffffffffffff16846040516102ae9190610558565b5f60405180830381855af49150503d805f81146102e6576040519150601f19603f3d011682016040523d82523d5f602084013e6102eb565b606091505b50915091506102fb85838361033c565b95945050505050565b341561009d576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6060826103515761034c826103ce565b6103c7565b8151158015610375575073ffffffffffffffffffffffffffffffffffffffff84163b155b156103c4576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610216565b50805b9392505050565b8051156103de5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808585111561041e575f80fd5b8386111561042a575f80fd5b5050820193919092039150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610475575f80fd5b823573ffffffffffffffffffffffffffffffffffffffff81168114610498575f80fd5b9150602083013567ffffffffffffffff808211156104b4575f80fd5b818501915085601f8301126104c7575f80fd5b8135818111156104d9576104d9610437565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561051f5761051f610437565b81604052828152886020848701011115610537575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610577576020818601810151858301520161055d565b505f92019182525091905056fea26469706673582212200ca61bd1e45d482203caba1d216b11bb6992f1ce0f6427bfe86e65b2f53457a264736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a264697066735822122070e0184cb0298270cb77d252235752ad92c48991a113c85600c93d56d7d33b3664736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonValidiumEtrog.json b/compiled-contracts/PolygonValidiumEtrog.json
index 520a989a5..3f770812a 100644
--- a/compiled-contracts/PolygonValidiumEtrog.json
+++ b/compiled-contracts/PolygonValidiumEtrog.json
@@ -44,6 +44,11 @@
"name": "ExceedMaxVerifyBatches",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalAccInputHashDoesNotMatch",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalNumBatchBelowLastVerifiedBatch",
@@ -159,6 +164,11 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MaxTimestampSequenceInvalid",
@@ -376,6 +386,25 @@
"name": "Initialized",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RollbackBatches",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -1033,6 +1062,24 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "rollbackBatches",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
"name": "rollupManager",
@@ -1075,15 +1122,20 @@
"name": "batches",
"type": "tuple[]"
},
+ {
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
+ },
{
"internalType": "uint64",
"name": "maxSequenceTimestamp",
"type": "uint64"
},
{
- "internalType": "uint64",
- "name": "initSequencedBatch",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "expectedFinalAccInputHash",
+ "type": "bytes32"
},
{
"internalType": "address",
@@ -1125,15 +1177,20 @@
"name": "batches",
"type": "tuple[]"
},
+ {
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
+ },
{
"internalType": "uint64",
"name": "maxSequenceTimestamp",
"type": "uint64"
},
{
- "internalType": "uint64",
- "name": "initSequencedBatch",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "expectedFinalAccInputHash",
+ "type": "bytes32"
},
{
"internalType": "address",
@@ -1304,8 +1361,8 @@
"type": "function"
}
],
- "bytecode": "0x61010060405234801562000011575f80fd5b50604051620050f3380380620050f383398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614f12620001e15f395f818161053b01528181610b3801528181610ca401528181610eec0152818161126e015281816117d201528181611c2101528181611d16015281816128f8015281816129770152818161299901528181612b3501528181612d4001528181612e0501528181613af901528181613b7201528181613b940152613c3c01525f81816106dc01528181611ee001528181611fe801528181612433015281816131f3015281816132c8015261364701525f8181610798015281816110e5015281816124af01528181612f4d01526136c301525f81816107f0015281816108cd01528181611c6a01528181612a450152612f220152614f125ff3fe608060405234801561000f575f80fd5b506004361061030e575f3560e01c80637a5460c51161019d578063c89e42df116100e8578063e46761c411610093578063eaeb077b1161006e578063eaeb077b14610846578063f35dda4714610859578063f851a44014610861575f80fd5b8063e46761c4146107eb578063e57a0b4c14610812578063e7a7ed0214610832575f80fd5b8063d7bc90ff116100c3578063d7bc90ff146107ba578063db5b0ed7146107c5578063def57e54146107d8575f80fd5b8063c89e42df14610760578063cfa8ed4714610773578063d02103ca14610793575f80fd5b8063a3c573eb11610148578063b0afe15411610123578063b0afe15414610724578063c754c7ed14610730578063c7fffd4b14610758575f80fd5b8063a3c573eb146106d7578063a652f26c146106fe578063ada8f91914610711575f80fd5b806391cafe321161017857806391cafe32146106965780639e001877146106a95780639f26f840146106c4575f80fd5b80637a5460c51461063f5780637cd76b8b1461067b5780638c3d73011461068e575f80fd5b806342308fab1161025d578063542028d5116102085780636e05d2cd116101e35780636e05d2cd146106105780636ff512cc14610619578063712570221461062c575f80fd5b8063542028d5146105e1578063676870d2146105e95780636b8616ce146105f1575f80fd5b80634c21fef3116102385780634c21fef31461055d5780634e4877061461059257806352bdeb6d146105a5575f80fd5b806342308fab146104f557806345605267146104fd57806349b7b80214610536575f80fd5b80632acdc2b6116102bd5780633c351e10116102985780633c351e10146104405780633cbc795b1461046057806340b5de6c1461049d575f80fd5b80632acdc2b6146103f85780632c111c061461040d57806332c2d1531461042d575f80fd5b8063107bf28c116102ed578063107bf28c1461039157806311e892d41461039957806326782247146103b3575f80fd5b8062d0295d14610312578063035089631461032d57806305835f3714610348575b5f80fd5b61031a610886565b6040519081526020015b60405180910390f35b610335602081565b60405161ffff9091168152602001610324565b6103846040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103249190614046565b61038461098c565b6103a160f981565b60405160ff9091168152602001610324565b6001546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610324565b61040b61040636600461406f565b610a18565b005b6008546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b61040b61043b3660046140d6565b610b36565b6009546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610324565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610324565b61031a602481565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610324565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b603c546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610324565b61040b6105a0366004614115565b610c05565b6103846040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610384610e14565b610335601f81565b61031a6105ff366004614115565b60066020525f908152604090205481565b61031a60055481565b61040b610627366004614130565b610e21565b61040b61063a366004614298565b610eea565b6103846040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040b610689366004614130565b6114a3565b61040b61156c565b61040b6106a4366004614130565b61163e565b6103d373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61040b6106d2366004614387565b611756565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b61038461070c3660046143c6565b611de2565b61040b61071f366004614130565b6121c0565b61031a6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a160e481565b61040b61076e366004614437565b612289565b6002546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b61031a635ca1ab1e81565b61040b6107d33660046144a7565b61231b565b61040b6107e6366004614570565b612c61565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b603c546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040b6108543660046145e8565b612cc9565b6103a1601b81565b5f546103d39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610912573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109369190614630565b6007549091505f906109609067ffffffffffffffff68010000000000000000820481169116614674565b67ffffffffffffffff169050805f0361097b575f9250505090565b610985818361469c565b9250505090565b60048054610999906146d4565b80601f01602080910402602001604051908101604052809291908181526020018280546109c5906146d4565b8015610a105780601f106109e757610100808354040283529160200191610a10565b820191905f5260205f20905b8154815290600101906020018083116109f357829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c5474010000000000000000000000000000000000000000900460ff16151581151503610ac8576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ba5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610bf891815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ca2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2f9190614725565b610d905760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610d90576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610999906146d4565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610e09565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f59576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610f7757505f54600160ff909116105b80610f905750303b158015610f9057505f5460ff166001145b611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f61108785613190565b6009549091505f906110d190889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611de2565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111709190614630565b90505f808483858f611183600143614740565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156112c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ed9190614759565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161137d91906147b9565b50600461138a89826147b9565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161142a939291906148d1565b60405180910390a1505050505050801561149a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146114f9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a90602001610e09565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115bd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611694576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116e3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610e09565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611794575073ffffffffffffffffffffffffffffffffffffffff81163314155b156117cb576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611839573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185d9190614759565b611867919061490f565b67ffffffffffffffff1611156118a9576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036118e4576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611920576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161194891849168010000000000000000900416614930565b1115611980576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611c1b575f8787838181106119bb576119bb614943565b90506020028101906119cd9190614970565b6119d6906149ac565b9050836119e281614a17565b825180516020918201208185015160408087015160608801519151959a509295505f94611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611ad6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611afa600188614740565b8403611b695742600760109054906101000a900467ffffffffffffffff168460400151611b27919061490f565b67ffffffffffffffff161115611b69576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1390614a3d565b9150506119a0565b50611c917f000000000000000000000000000000000000000000000000000000000000000084611c49610886565b611c539190614a74565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d62908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da29190614759565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611e1496959493929190614a8b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611f645760f9601f8351611ea89190614aed565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f4e9796959493929190614b08565b6040516020818303038152906040529050612068565b815161ffff1015611fa1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fb0602083614aed565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120559796959493929190614bea565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120c6573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661213e576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121839084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614ccc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612216576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610e09565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122df576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122eb82826147b9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610e099190614046565b60025473ffffffffffffffffffffffffffffffffffffffff16331461236c576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855f8190036123a7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123e3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ee602442614930565b8667ffffffffffffffff161115612431576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612496575f80fd5b505af11580156124a8573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612516573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253a9190614630565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b8681101561286b575f8e8e8381811061257957612579614943565b90506080020180360381019061258f9190614d27565b604081015190915067ffffffffffffffff161561277c57856125b081614a17565b9650505f815f01518260200151836040015184606001516040516020016126159493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526006909352912054909150811461269d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001612736969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612858565b8051604051612798918591602001918252602082015260400190565b60405160208183030381529060405280519060200120925084815f0151888f8e5f801b60405160200161283f969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b6040516020818303038152906040528051906020012094505b508061286381614a3d565b91505061255e565b5060075467ffffffffffffffff90811690851611156128b6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff8581169084161461296b575f6128db8487614674565b90506128f167ffffffffffffffff821683614740565b915061292a7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c49610886565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b8015612af457612a6d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a249190614630565b612a2e9190614a74565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b603c546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b90612ac79085908d908d90600401614dba565b5f6040518083038186803b158015612add575f80fd5b505afa158015612aef573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612b90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bb49190614759565b9050612bc08882614674565b67ffffffffffffffff168c67ffffffffffffffff1614612c0c576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612c4891815260200190565b60405180910390a2505050505050505050505050505050565b603c5474010000000000000000000000000000000000000000900460ff16612cb5576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cc2858585858561352f565b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612d07575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612d3e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dcb9190614725565b15612e02576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e909190614630565b905082811115612ecc576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612f08576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f4a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd89190614630565b6007805491925067ffffffffffffffff909116905f612ff683614a17565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050858560405161302d929190614ddc565b6040519081900390208142613043600143614740565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613139576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2613188565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061317f90849033908b908b90614deb565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff8216156133ed576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613237573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261327c9190810190614e2a565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa15801561330e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133329190614e93565b915091508163ffffffff165f146133a9576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556133ea565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613d65565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314613580576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036135bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156135f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613602602442614930565b8467ffffffffffffffff161115613645576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156136aa575f80fd5b505af11580156136bc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561372a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061374e9190614630565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b85811015613a6c575f8b8b8381811061378c5761378c614943565b905060200281019061379e9190614970565b6137a7906149ac565b8051805160209091012060408201519192509067ffffffffffffffff161561398757856137d381614a17565b9650505f818360200151846040015185606001516040516020016138359493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146138bd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613a57565b8151516201d4c010156139c6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613a6490614a3d565b915050613771565b5060075467ffffffffffffffff9081169084161115613ab7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614613b6c575f613adc8386614674565b9050613af267ffffffffffffffff821683614740565b9150613b2b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c49610886565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613bfb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a00573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613c97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cbb9190614759565b9050613cc78782614674565b67ffffffffffffffff168967ffffffffffffffff1614613d13576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051613d4f91815260200190565b60405180910390a2505050505050505050505050565b5f613dc6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e709092919063ffffffff16565b8051909150156134c65780806020019051810190613de49190614725565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611018565b60606121b884845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613ea29190614ecb565b5f6040518083038185875af1925050503d805f8114613edc576040519150601f19603f3d011682016040523d82523d5f602084013e613ee1565b606091505b5091509150613ef287838387613efd565b979650505050505050565b60608315613f925782515f03613f8b5773ffffffffffffffffffffffffffffffffffffffff85163b613f8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611018565b50816121b8565b6121b88383815115613fa75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189190614046565b5f5b83811015613ff5578181015183820152602001613fdd565b50505f910152565b5f8151808452614014816020860160208601613fdb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6140586020830184613ffd565b9392505050565b801515811461406c575f80fd5b50565b5f6020828403121561407f575f80fd5b81356140588161405f565b67ffffffffffffffff8116811461406c575f80fd5b80356133ed8161408a565b73ffffffffffffffffffffffffffffffffffffffff8116811461406c575f80fd5b80356133ed816140aa565b5f805f606084860312156140e8575f80fd5b83356140f38161408a565b925060208401359150604084013561410a816140aa565b809150509250925092565b5f60208284031215614125575f80fd5b81356140588161408a565b5f60208284031215614140575f80fd5b8135614058816140aa565b63ffffffff8116811461406c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156141ac576141ac61415c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156141f9576141f961415c565b604052919050565b5f67ffffffffffffffff82111561421a5761421a61415c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614255575f80fd5b813561426861426382614201565b6141b2565b81815284602083860101111561427c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156142ad575f80fd5b86356142b8816140aa565b955060208701356142c8816140aa565b945060408701356142d88161414b565b935060608701356142e8816140aa565b9250608087013567ffffffffffffffff80821115614304575f80fd5b6143108a838b01614246565b935060a0890135915080821115614325575f80fd5b5061433289828a01614246565b9150509295509295509295565b5f8083601f84011261434f575f80fd5b50813567ffffffffffffffff811115614366575f80fd5b6020830191508360208260051b8501011115614380575f80fd5b9250929050565b5f8060208385031215614398575f80fd5b823567ffffffffffffffff8111156143ae575f80fd5b6143ba8582860161433f565b90969095509350505050565b5f805f80608085870312156143d9575f80fd5b84356143e48161414b565b935060208501356143f4816140aa565b925060408501356144048161414b565b9150606085013567ffffffffffffffff81111561441f575f80fd5b61442b87828801614246565b91505092959194509250565b5f60208284031215614447575f80fd5b813567ffffffffffffffff81111561445d575f80fd5b6121b884828501614246565b5f8083601f840112614479575f80fd5b50813567ffffffffffffffff811115614490575f80fd5b602083019150836020828501011115614380575f80fd5b5f805f805f805f60a0888a0312156144bd575f80fd5b873567ffffffffffffffff808211156144d4575f80fd5b818a0191508a601f8301126144e7575f80fd5b8135818111156144f5575f80fd5b8b60208260071b8501011115614509575f80fd5b6020830199508098505061451f60208b0161409f565b965061452d60408b0161409f565b955061453b60608b016140cb565b945060808a0135915080821115614550575f80fd5b5061455d8a828b01614469565b989b979a50959850939692959293505050565b5f805f805f60808688031215614584575f80fd5b853567ffffffffffffffff81111561459a575f80fd5b6145a68882890161433f565b90965094505060208601356145ba8161408a565b925060408601356145ca8161408a565b915060608601356145da816140aa565b809150509295509295909350565b5f805f604084860312156145fa575f80fd5b833567ffffffffffffffff811115614610575f80fd5b61461c86828701614469565b909790965060209590950135949350505050565b5f60208284031215614640575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561469557614695614647565b5092915050565b5f826146cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806146e857607f821691505b60208210810361471f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215614735575f80fd5b81516140588161405f565b8181038181111561475357614753614647565b92915050565b5f60208284031215614769575f80fd5b81516140588161408a565b601f8211156134c6575f81815260208120601f850160051c8101602086101561479a5750805b601f850160051c820191505b81811015613188578281556001016147a6565b815167ffffffffffffffff8111156147d3576147d361415c565b6147e7816147e184546146d4565b84614774565b602080601f831160018114614839575f84156148035750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613188565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561488557888601518255948401946001909101908401614866565b50858210156148c157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6148e36060830186613ffd565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561469557614695614647565b8082018082111561475357614753614647565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a2575f80fd5b9190910192915050565b5f608082360312156149bc575f80fd5b6149c4614189565b823567ffffffffffffffff8111156149da575f80fd5b6149e636828601614246565b825250602083013560208201526040830135614a018161408a565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103614a3357614a33614647565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6d57614a6d614647565b5060010190565b808202811582820484141761475357614753614647565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614ae160c0830184613ffd565b98975050505050505050565b61ffff81811683821601908082111561469557614695614647565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614b70816003860160208c01613fdb565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614bb3816017840160208b01613fdb565b808201915050818660f81b16601782015284519150614bd9826018830160208801613fdb565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614c52816003860160208c01613fdb565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c95816017840160208b01613fdb565b808201915050818660f01b16601782015284519150614cbb826019830160208801613fdb565b016019019998505050505050505050565b5f8651614cdd818460208b01613fdb565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b5f60808284031215614d37575f80fd5b614d3f614189565b82358152602083013560208201526040830135614d5b8161408a565b60408201526060928301359281019290925250919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f614dd3604083018486614d73565b95945050505050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614e20606083018486614d73565b9695505050505050565b5f60208284031215614e3a575f80fd5b815167ffffffffffffffff811115614e50575f80fd5b8201601f81018413614e60575f80fd5b8051614e6e61426382614201565b818152856020838501011115614e82575f80fd5b614dd3826020830160208601613fdb565b5f8060408385031215614ea4575f80fd5b8251614eaf8161414b565b6020840151909250614ec0816140aa565b809150509250929050565b5f82516149a2818460208701613fdb56fea264697066735822122085d6102c7b102508ac302be4996dd1d95adaef2c7433f342bc0b8f96d63fde2064736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061030e575f3560e01c80637a5460c51161019d578063c89e42df116100e8578063e46761c411610093578063eaeb077b1161006e578063eaeb077b14610846578063f35dda4714610859578063f851a44014610861575f80fd5b8063e46761c4146107eb578063e57a0b4c14610812578063e7a7ed0214610832575f80fd5b8063d7bc90ff116100c3578063d7bc90ff146107ba578063db5b0ed7146107c5578063def57e54146107d8575f80fd5b8063c89e42df14610760578063cfa8ed4714610773578063d02103ca14610793575f80fd5b8063a3c573eb11610148578063b0afe15411610123578063b0afe15414610724578063c754c7ed14610730578063c7fffd4b14610758575f80fd5b8063a3c573eb146106d7578063a652f26c146106fe578063ada8f91914610711575f80fd5b806391cafe321161017857806391cafe32146106965780639e001877146106a95780639f26f840146106c4575f80fd5b80637a5460c51461063f5780637cd76b8b1461067b5780638c3d73011461068e575f80fd5b806342308fab1161025d578063542028d5116102085780636e05d2cd116101e35780636e05d2cd146106105780636ff512cc14610619578063712570221461062c575f80fd5b8063542028d5146105e1578063676870d2146105e95780636b8616ce146105f1575f80fd5b80634c21fef3116102385780634c21fef31461055d5780634e4877061461059257806352bdeb6d146105a5575f80fd5b806342308fab146104f557806345605267146104fd57806349b7b80214610536575f80fd5b80632acdc2b6116102bd5780633c351e10116102985780633c351e10146104405780633cbc795b1461046057806340b5de6c1461049d575f80fd5b80632acdc2b6146103f85780632c111c061461040d57806332c2d1531461042d575f80fd5b8063107bf28c116102ed578063107bf28c1461039157806311e892d41461039957806326782247146103b3575f80fd5b8062d0295d14610312578063035089631461032d57806305835f3714610348575b5f80fd5b61031a610886565b6040519081526020015b60405180910390f35b610335602081565b60405161ffff9091168152602001610324565b6103846040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103249190614046565b61038461098c565b6103a160f981565b60405160ff9091168152602001610324565b6001546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610324565b61040b61040636600461406f565b610a18565b005b6008546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b61040b61043b3660046140d6565b610b36565b6009546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104889074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610324565b6104c47fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610324565b61031a602481565b60075461051d9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610324565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b603c546105829074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610324565b61040b6105a0366004614115565b610c05565b6103846040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610384610e14565b610335601f81565b61031a6105ff366004614115565b60066020525f908152604090205481565b61031a60055481565b61040b610627366004614130565b610e21565b61040b61063a366004614298565b610eea565b6103846040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040b610689366004614130565b6114a3565b61040b61156c565b61040b6106a4366004614130565b61163e565b6103d373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61040b6106d2366004614387565b611756565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b61038461070c3660046143c6565b611de2565b61040b61071f366004614130565b6121c0565b61031a6405ca1ab1e081565b60075461051d90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103a160e481565b61040b61076e366004614437565b612289565b6002546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b61031a635ca1ab1e81565b61040b6107d33660046144a7565b61231b565b61040b6107e6366004614570565b612c61565b6103d37f000000000000000000000000000000000000000000000000000000000000000081565b603c546103d39073ffffffffffffffffffffffffffffffffffffffff1681565b60075461051d9067ffffffffffffffff1681565b61040b6108543660046145e8565b612cc9565b6103a1601b81565b5f546103d39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610912573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109369190614630565b6007549091505f906109609067ffffffffffffffff68010000000000000000820481169116614674565b67ffffffffffffffff169050805f0361097b575f9250505090565b610985818361469c565b9250505090565b60048054610999906146d4565b80601f01602080910402602001604051908101604052809291908181526020018280546109c5906146d4565b8015610a105780601f106109e757610100808354040283529160200191610a10565b820191905f5260205f20905b8154815290600101906020018083116109f357829003601f168201915b505050505081565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a6e576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c5474010000000000000000000000000000000000000000900460ff16151581151503610ac8576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ba5576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610bf891815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610ca2576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2f9190614725565b610d905760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610d90576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b60038054610999906146d4565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e77576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610e09565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610f59576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610f7757505f54600160ff909116105b80610f905750303b158015610f9057505f5460ff166001145b611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561107d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f61108785613190565b6009549091505f906110d190889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611de2565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561114c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111709190614630565b90505f808483858f611183600143614740565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156112c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ed9190614759565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161137d91906147b9565b50600461138a89826147b9565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161142a939291906148d1565b60405180910390a1505050505050801561149a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146114f9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a90602001610e09565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115bd576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611694576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166116e3576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610e09565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611794575073ffffffffffffffffffffffffffffffffffffffff81163314155b156117cb576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611839573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185d9190614759565b611867919061490f565b67ffffffffffffffff1611156118a9576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036118e4576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611920576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161194891849168010000000000000000900416614930565b1115611980576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611c1b575f8787838181106119bb576119bb614943565b90506020028101906119cd9190614970565b6119d6906149ac565b9050836119e281614a17565b825180516020918201208185015160408087015160608801519151959a509295505f94611a4e948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611ad6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611afa600188614740565b8403611b695742600760109054906101000a900467ffffffffffffffff168460400151611b27919061490f565b67ffffffffffffffff161115611b69576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611c1390614a3d565b9150506119a0565b50611c917f000000000000000000000000000000000000000000000000000000000000000084611c49610886565b611c539190614a74565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691906133f2565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611d62908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da29190614759565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611e1496959493929190614a8b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611f645760f9601f8351611ea89190614aed565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611f4e9796959493929190614b08565b6040516020818303038152906040529050612068565b815161ffff1015611fa1576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611fb0602083614aed565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525085886040516020016120559796959493929190614bea565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156120c6573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661213e576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121839084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614ccc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612216576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610e09565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146122df576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036122eb82826147b9565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610e099190614046565b60025473ffffffffffffffffffffffffffffffffffffffff16331461236c576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855f8190036123a7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123e3576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ee602442614930565b8667ffffffffffffffff161115612431576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612496575f80fd5b505af11580156124a8573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612516573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253a9190614630565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f805b8681101561286b575f8e8e8381811061257957612579614943565b90506080020180360381019061258f9190614d27565b604081015190915067ffffffffffffffff161561277c57856125b081614a17565b9650505f815f01518260200151836040015184606001516040516020016126159493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526006909352912054909150811461269d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85825f0151836020015184604001518f8660600151604051602001612736969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612858565b8051604051612798918591602001918252602082015260400190565b60405160208183030381529060405280519060200120925084815f0151888f8e5f801b60405160200161283f969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b6040516020818303038152906040528051906020012094505b508061286381614a3d565b91505061255e565b5060075467ffffffffffffffff90811690851611156128b6576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058390558567ffffffffffffffff8581169084161461296b575f6128db8487614674565b90506128f167ffffffffffffffff821683614740565b915061292a7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c49610886565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8816021790555b8015612af457612a6d337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a249190614630565b612a2e9190614a74565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906134cb565b603c546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b90612ac79085908d908d90600401614dba565b5f6040518083038186803b158015612add575f80fd5b505afa158015612aef573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018590525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612b90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bb49190614759565b9050612bc08882614674565b67ffffffffffffffff168c67ffffffffffffffff1614612c0c576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612c4891815260200190565b60405180910390a2505050505050505050505050505050565b603c5474010000000000000000000000000000000000000000900460ff16612cb5576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cc2858585858561352f565b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612d07575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612d3e576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dcb9190614725565b15612e02576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e909190614630565b905082811115612ecc576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612f08576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f4a73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846134cb565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fd89190614630565b6007805491925067ffffffffffffffff909116905f612ff683614a17565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050858560405161302d929190614ddc565b6040519081900390208142613043600143614740565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613139576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2613188565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061317f90849033908b908b90614deb565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff8216156133ed576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613237573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261327c9190810190614e2a565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa15801561330e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133329190614e93565b915091508163ffffffff165f146133a9576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556133ea565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526134c69084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613d65565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135299085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613444565b50505050565b60025473ffffffffffffffffffffffffffffffffffffffff163314613580576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036135bb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156135f7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613602602442614930565b8467ffffffffffffffff161115613645576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156136aa575f80fd5b505af11580156136bc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561372a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061374e9190614630565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b85811015613a6c575f8b8b8381811061378c5761378c614943565b905060200281019061379e9190614970565b6137a7906149ac565b8051805160209091012060408201519192509067ffffffffffffffff161561398757856137d381614a17565b9650505f818360200151846040015185606001516040516020016138359493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146138bd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613a57565b8151516201d4c010156139c6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613a6490614a3d565b915050613771565b5060075467ffffffffffffffff9081169084161115613ab7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614613b6c575f613adc8386614674565b9050613af267ffffffffffffffff821683614740565b9150613b2b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611c49610886565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613bfb337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a00573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613c97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cbb9190614759565b9050613cc78782614674565b67ffffffffffffffff168967ffffffffffffffff1614613d13576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051613d4f91815260200190565b60405180910390a2505050505050505050505050565b5f613dc6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e709092919063ffffffff16565b8051909150156134c65780806020019051810190613de49190614725565b6134c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611018565b60606121b884845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613ea29190614ecb565b5f6040518083038185875af1925050503d805f8114613edc576040519150601f19603f3d011682016040523d82523d5f602084013e613ee1565b606091505b5091509150613ef287838387613efd565b979650505050505050565b60608315613f925782515f03613f8b5773ffffffffffffffffffffffffffffffffffffffff85163b613f8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611018565b50816121b8565b6121b88383815115613fa75781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110189190614046565b5f5b83811015613ff5578181015183820152602001613fdd565b50505f910152565b5f8151808452614014816020860160208601613fdb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6140586020830184613ffd565b9392505050565b801515811461406c575f80fd5b50565b5f6020828403121561407f575f80fd5b81356140588161405f565b67ffffffffffffffff8116811461406c575f80fd5b80356133ed8161408a565b73ffffffffffffffffffffffffffffffffffffffff8116811461406c575f80fd5b80356133ed816140aa565b5f805f606084860312156140e8575f80fd5b83356140f38161408a565b925060208401359150604084013561410a816140aa565b809150509250925092565b5f60208284031215614125575f80fd5b81356140588161408a565b5f60208284031215614140575f80fd5b8135614058816140aa565b63ffffffff8116811461406c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff811182821017156141ac576141ac61415c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156141f9576141f961415c565b604052919050565b5f67ffffffffffffffff82111561421a5761421a61415c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112614255575f80fd5b813561426861426382614201565b6141b2565b81815284602083860101111561427c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c087890312156142ad575f80fd5b86356142b8816140aa565b955060208701356142c8816140aa565b945060408701356142d88161414b565b935060608701356142e8816140aa565b9250608087013567ffffffffffffffff80821115614304575f80fd5b6143108a838b01614246565b935060a0890135915080821115614325575f80fd5b5061433289828a01614246565b9150509295509295509295565b5f8083601f84011261434f575f80fd5b50813567ffffffffffffffff811115614366575f80fd5b6020830191508360208260051b8501011115614380575f80fd5b9250929050565b5f8060208385031215614398575f80fd5b823567ffffffffffffffff8111156143ae575f80fd5b6143ba8582860161433f565b90969095509350505050565b5f805f80608085870312156143d9575f80fd5b84356143e48161414b565b935060208501356143f4816140aa565b925060408501356144048161414b565b9150606085013567ffffffffffffffff81111561441f575f80fd5b61442b87828801614246565b91505092959194509250565b5f60208284031215614447575f80fd5b813567ffffffffffffffff81111561445d575f80fd5b6121b884828501614246565b5f8083601f840112614479575f80fd5b50813567ffffffffffffffff811115614490575f80fd5b602083019150836020828501011115614380575f80fd5b5f805f805f805f60a0888a0312156144bd575f80fd5b873567ffffffffffffffff808211156144d4575f80fd5b818a0191508a601f8301126144e7575f80fd5b8135818111156144f5575f80fd5b8b60208260071b8501011115614509575f80fd5b6020830199508098505061451f60208b0161409f565b965061452d60408b0161409f565b955061453b60608b016140cb565b945060808a0135915080821115614550575f80fd5b5061455d8a828b01614469565b989b979a50959850939692959293505050565b5f805f805f60808688031215614584575f80fd5b853567ffffffffffffffff81111561459a575f80fd5b6145a68882890161433f565b90965094505060208601356145ba8161408a565b925060408601356145ca8161408a565b915060608601356145da816140aa565b809150509295509295909350565b5f805f604084860312156145fa575f80fd5b833567ffffffffffffffff811115614610575f80fd5b61461c86828701614469565b909790965060209590950135949350505050565b5f60208284031215614640575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561469557614695614647565b5092915050565b5f826146cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806146e857607f821691505b60208210810361471f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215614735575f80fd5b81516140588161405f565b8181038181111561475357614753614647565b92915050565b5f60208284031215614769575f80fd5b81516140588161408a565b601f8211156134c6575f81815260208120601f850160051c8101602086101561479a5750805b601f850160051c820191505b81811015613188578281556001016147a6565b815167ffffffffffffffff8111156147d3576147d361415c565b6147e7816147e184546146d4565b84614774565b602080601f831160018114614839575f84156148035750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613188565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561488557888601518255948401946001909101908401614866565b50858210156148c157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f6148e36060830186613ffd565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561469557614695614647565b8082018082111561475357614753614647565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126149a2575f80fd5b9190910192915050565b5f608082360312156149bc575f80fd5b6149c4614189565b823567ffffffffffffffff8111156149da575f80fd5b6149e636828601614246565b825250602083013560208201526040830135614a018161408a565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103614a3357614a33614647565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6d57614a6d614647565b5060010190565b808202811582820484141761475357614753614647565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614ae160c0830184613ffd565b98975050505050505050565b61ffff81811683821601908082111561469557614695614647565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614b70816003860160208c01613fdb565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614bb3816017840160208b01613fdb565b808201915050818660f81b16601782015284519150614bd9826018830160208801613fdb565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614c52816003860160208c01613fdb565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614c95816017840160208b01613fdb565b808201915050818660f01b16601782015284519150614cbb826019830160208801613fdb565b016019019998505050505050505050565b5f8651614cdd818460208b01613fdb565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b5f60808284031215614d37575f80fd5b614d3f614189565b82358152602083013560208201526040830135614d5b8161408a565b60408201526060928301359281019290925250919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f614dd3604083018486614d73565b95945050505050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614e20606083018486614d73565b9695505050505050565b5f60208284031215614e3a575f80fd5b815167ffffffffffffffff811115614e50575f80fd5b8201601f81018413614e60575f80fd5b8051614e6e61426382614201565b818152856020838501011115614e82575f80fd5b614dd3826020830160208601613fdb565b5f8060408385031215614ea4575f80fd5b8251614eaf8161414b565b6020840151909250614ec0816140aa565b809150509250929050565b5f82516149a2818460208701613fdb56fea264697066735822122085d6102c7b102508ac302be4996dd1d95adaef2c7433f342bc0b8f96d63fde2064736f6c63430008140033",
+ "bytecode": "0x61010060405234801562000011575f80fd5b506040516200532d3803806200532d83398101604081905262000034916200014e565b6001600160a01b0380851660a05280841660805280831660c052811660e05283838383838383836200006562000077565b505050505050505050505050620001b3565b5f54610100900460ff1615620000e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000134575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014b575f80fd5b50565b5f805f806080858703121562000162575f80fd5b84516200016f8162000136565b6020860151909450620001828162000136565b6040860151909350620001958162000136565b6060860151909250620001a88162000136565b939692955090935050565b60805160a05160c05160e051615066620002c75f395f818161055901528181611027015281816110ee01528181611110015281816112ac015281816114db01528181611647015281816117c60152818161194601528181611cc80152818161222c0152818161267b0152818161272801528181612e0e01528181612ed301528181613c2301528181613c9c01528181613cbe0152613d6601525f818161070d01528181610b4e015281816128f2015281816129fa015281816133fd015281816134d2015261371401525f81816107dc01528181610bfc01528181611b3f0152818161301b01526137c201525f818161080e015281816108eb0152818161107a015281816111bc0152612ff001526150665ff3fe608060405234801561000f575f80fd5b5060043610610319575f3560e01c80636ff512cc116101a8578063b910e0f9116100f3578063d7bc90ff1161009e578063e7a7ed0211610079578063e7a7ed0214610850578063eaeb077b14610864578063f35dda4714610877578063f851a4401461087f575f80fd5b8063d7bc90ff146107fe578063e46761c414610809578063e57a0b4c14610830575f80fd5b8063c89e42df116100ce578063c89e42df146107a4578063cfa8ed47146107b7578063d02103ca146107d7575f80fd5b8063b910e0f914610761578063c754c7ed14610774578063c7fffd4b1461079c575f80fd5b80639e00187711610153578063a652f26c1161012e578063a652f26c1461072f578063ada8f91914610742578063b0afe15414610755575f80fd5b80639e001877146106da5780639f26f840146106f5578063a3c573eb14610708575f80fd5b80637cd76b8b116101835780637cd76b8b146106ac5780638c3d7301146106bf57806391cafe32146106c7575f80fd5b80636ff512cc1461064a578063712570221461065d5780637a5460c514610670575f80fd5b806340b5de6c1161026857806352bdeb6d11610213578063676870d2116101ee578063676870d21461061a5780636b8616ce146106225780636e05d2cd14610641575f80fd5b806352bdeb6d146105c3578063542028d5146105ff578063669adece14610607575f80fd5b806349b7b8021161024357806349b7b802146105545780634c21fef31461057b5780634e487706146105b0575f80fd5b806340b5de6c146104bb57806342308fab14610513578063456052671461051b575f80fd5b806326782247116102c857806332c2d153116102a357806332c2d1531461044b5780633c351e101461045e5780633cbc795b1461047e575f80fd5b806326782247146103d35780632acdc2b6146104185780632c111c061461042b575f80fd5b8063107bf28c116102f8578063107bf28c1461039c57806311e892d4146103a4578063165e8a8d146103be575f80fd5b8062d0295d1461031d578063035089631461033857806305835f3714610353575b5f80fd5b6103256108a4565b6040519081526020015b60405180910390f35b610340602081565b60405161ffff909116815260200161032f565b61038f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032f9190614154565b61038f6109aa565b6103ac60f981565b60405160ff909116815260200161032f565b6103d16103cc36600461421d565b610a36565b005b6001546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032f565b6103d16104263660046142fc565b6113bb565b6008546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6103d1610459366004614317565b6114d9565b6009546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104a69074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032f565b6104e27fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032f565b610325602481565b60075461053b9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032f565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b603c546105a09074010000000000000000000000000000000000000000900460ff1681565b604051901515815260200161032f565b6103d16105be366004614356565b6115a8565b61038f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038f6117b7565b6103d1610615366004614371565b6117c4565b610340601f81565b610325610630366004614356565b60066020525f908152604090205481565b61032560055481565b6103d161065836600461439b565b61187b565b6103d161066b3660046144f2565b611944565b61038f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103d16106ba36600461439b565b611efd565b6103d1611fc6565b6103d16106d536600461439b565b612098565b6103f373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103d16107033660046145da565b6121b0565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61038f61073d366004614619565b6127f4565b6103d161075036600461439b565b612bd2565b6103256405ca1ab1e081565b6103d161076f36600461468a565b612c9b565b60075461053b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ac60e481565b6103d16107b236600461470a565b612d05565b6002546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b610325635ca1ab1e81565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b603c546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b60075461053b9067ffffffffffffffff1681565b6103d161087236600461473c565b612d97565b6103ac601b81565b5f546103f39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610930573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109549190614784565b6007549091505f9061097e9067ffffffffffffffff680100000000000000008204811691166147c8565b67ffffffffffffffff169050805f03610999575f9250505090565b6109a381836147f0565b9250505090565b600480546109b790614828565b80601f01602080910402602001604051908101604052809291908181526020018280546109e390614828565b8015610a2e5780601f10610a0557610100808354040283529160200191610a2e565b820191905f5260205f20905b815481529060010190602001808311610a1157829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a87576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b865f819003610ac2576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610afe576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b09602442614879565b8667ffffffffffffffff161115610b4c576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610bb1575f80fd5b505af1158015610bc3573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa158015610c57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7b9190614784565b905080610cb4576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015610f9a575f8e8e83818110610cf057610cf0614892565b905060800201803603810190610d0691906148bf565b604081015190915067ffffffffffffffff1615610ef35784610d278161490b565b9550505f815f0151826020015183604001518460600151604051602001610d8c9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114610e14576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84825f0151836020015184604001518e8660600151604051602001610ead969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120945060065f8767ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550610f87565b8051604080516020810187905290810191909152606080820188905260c08e901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012093505b5080610f9281614931565b915050610cd5565b5060075467ffffffffffffffff9081169084161115610fe5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146110e2575f61100a83866147c8565b905061102067ffffffffffffffff821683614968565b91506110a17f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110596108a4565b611063919061497b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061325d565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b801561126b576111e4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119b9190614784565b6111a5919061497b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613336565b603c546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b9061123e908d908c908c906004016149d9565b5f6040518083038186803b158015611254575f80fd5b505afa158015611266573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611307573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132b91906149fb565b90508a8414611366576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516113a291815260200190565b60405180910390a2505050505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611411576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c5474010000000000000000000000000000000000000000900460ff1615158115150361146b576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611548576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161159b91815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611645576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d29190614a16565b6117335760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611733576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109b790614828565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611833576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146118d1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016117ac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146119b3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156119d157505f54600160ff909116105b806119ea5750303b1580156119ea57505f5460ff166001145b611a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ad7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611ae18561339a565b6009549091505f90611b2b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856127f4565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bca9190614784565b90505f808483858f611bdd600143614968565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611d23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4791906149fb565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dd79190614a76565b506004611de48982614a76565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e8493929190614b8e565b60405180910390a15050505050508015611ef4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f53576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016117ac565b60015473ffffffffffffffffffffffffffffffffffffffff163314612017576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146120ee576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661213d576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016117ac565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906121ee575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612225576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612293573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b791906149fb565b6122c19190614bcc565b67ffffffffffffffff161115612303576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361233e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561237a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916123a291849168010000000000000000900416614879565b11156123da576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612675575f87878381811061241557612415614892565b90506020028101906124279190614bed565b61243090614c29565b90508361243c8161490b565b825180516020918201208185015160408087015160608801519151959a509295505f946124a8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612530576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612554600188614968565b84036125c35742600760109054906101000a900467ffffffffffffffff1684604001516125819190614bcc565b67ffffffffffffffff1611156125c3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061266d90614931565b9150506123fa565b506126a37f0000000000000000000000000000000000000000000000000000000000000000846110596108a4565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612774908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b491906149fb565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f8760405160240161282696959493929190614c94565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036129765760f9601f83516128ba9190614cf6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016129609796959493929190614d11565b6040516020818303038152906040529050612a7a565b815161ffff10156129b3576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96129c2602083614cf6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612a679796959493929190614df3565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ad8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612b50576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612b959084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614ed5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016117ac565b603c5474010000000000000000000000000000000000000000900460ff16612cef576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cfd8686868686866135fc565b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612d5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612d678282614a76565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516117ac9190614154565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612dd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e999190614a16565b15612ed0576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5e9190614784565b905082811115612f9a576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612fd6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613336565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613082573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a69190614784565b6007805491925067ffffffffffffffff909116905f6130c48361490b565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505085856040516130fb929190614f30565b6040519081900390208142613111600143614968565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613207576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612cfd565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061324d90849033908b908b90614f3f565b60405180910390a2505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133319084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613e73565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526133949085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016132af565b50505050565b606073ffffffffffffffffffffffffffffffffffffffff8216156135f7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613441573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526134869190810190614f7e565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061353c9190614fe7565b915091508163ffffffff165f146135b3576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556135f4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461364d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f819003613688576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156136c4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136cf602442614879565b8467ffffffffffffffff161115613712576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613777575f80fd5b505af1158015613789573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa15801561381d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138419190614784565b90508061387a576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015613b96575f8c8c838181106138b6576138b6614892565b90506020028101906138c89190614bed565b6138d190614c29565b8051805160209091012060408201519192509067ffffffffffffffff1615613ab157856138fd8161490b565b9650505f8183602001518460400151856060015160405160200161395f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146139e7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613b81565b8151516201d4c01015613af0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613b8e90614931565b91505061389b565b5060075467ffffffffffffffff9081169084161115613be1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614613c96575f613c0683866147c8565b9050613c1c67ffffffffffffffff821683614968565b9150613c557f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110596108a4565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613d25337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613dc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de591906149fb565b9050888414613e20576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051613e5c91815260200190565b60405180910390a250505050505050505050505050565b5f613ed4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f7e9092919063ffffffff16565b8051909150156133315780806020019051810190613ef29190614a16565b613331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611a72565b6060612bca84845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613fb0919061501f565b5f6040518083038185875af1925050503d805f8114613fea576040519150601f19603f3d011682016040523d82523d5f602084013e613fef565b606091505b50915091506140008783838761400b565b979650505050505050565b606083156140a05782515f036140995773ffffffffffffffffffffffffffffffffffffffff85163b614099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a72565b5081612bca565b612bca83838151156140b55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a729190614154565b5f5b838110156141035781810151838201526020016140eb565b50505f910152565b5f81518084526141228160208601602086016140e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f614166602083018461410b565b9392505050565b63ffffffff8116811461417e575f80fd5b50565b80356135f78161416d565b67ffffffffffffffff8116811461417e575f80fd5b80356135f78161418c565b73ffffffffffffffffffffffffffffffffffffffff8116811461417e575f80fd5b80356135f7816141ac565b5f8083601f8401126141e8575f80fd5b50813567ffffffffffffffff8111156141ff575f80fd5b602083019150836020828501011115614216575f80fd5b9250929050565b5f805f805f805f8060c0898b031215614234575f80fd5b883567ffffffffffffffff8082111561424b575f80fd5b818b0191508b601f83011261425e575f80fd5b81358181111561426c575f80fd5b8c60208260071b8501011115614280575f80fd5b602083019a508099505061429660208c01614181565b97506142a460408c016141a1565b965060608b013595506142b960808c016141cd565b945060a08b01359150808211156142ce575f80fd5b506142db8b828c016141d8565b999c989b5096995094979396929594505050565b801515811461417e575f80fd5b5f6020828403121561430c575f80fd5b8135614166816142ef565b5f805f60608486031215614329575f80fd5b83356143348161418c565b925060208401359150604084013561434b816141ac565b809150509250925092565b5f60208284031215614366575f80fd5b81356141668161418c565b5f8060408385031215614382575f80fd5b823561438d8161418c565b946020939093013593505050565b5f602082840312156143ab575f80fd5b8135614166816141ac565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614406576144066143b6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614453576144536143b6565b604052919050565b5f67ffffffffffffffff821115614474576144746143b6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126144af575f80fd5b81356144c26144bd8261445b565b61440c565b8181528460208386010111156144d6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614507575f80fd5b8635614512816141ac565b95506020870135614522816141ac565b945060408701356145328161416d565b93506060870135614542816141ac565b9250608087013567ffffffffffffffff8082111561455e575f80fd5b61456a8a838b016144a0565b935060a089013591508082111561457f575f80fd5b5061458c89828a016144a0565b9150509295509295509295565b5f8083601f8401126145a9575f80fd5b50813567ffffffffffffffff8111156145c0575f80fd5b6020830191508360208260051b8501011115614216575f80fd5b5f80602083850312156145eb575f80fd5b823567ffffffffffffffff811115614601575f80fd5b61460d85828601614599565b90969095509350505050565b5f805f806080858703121561462c575f80fd5b84356146378161416d565b93506020850135614647816141ac565b925060408501356146578161416d565b9150606085013567ffffffffffffffff811115614672575f80fd5b61467e878288016144a0565b91505092959194509250565b5f805f805f8060a0878903121561469f575f80fd5b863567ffffffffffffffff8111156146b5575f80fd5b6146c189828a01614599565b90975095505060208701356146d58161416d565b935060408701356146e58161418c565b92506060870135915060808701356146fc816141ac565b809150509295509295509295565b5f6020828403121561471a575f80fd5b813567ffffffffffffffff811115614730575f80fd5b612bca848285016144a0565b5f805f6040848603121561474e575f80fd5b833567ffffffffffffffff811115614764575f80fd5b614770868287016141d8565b909790965060209590950135949350505050565b5f60208284031215614794575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156147e9576147e961479b565b5092915050565b5f82614823577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061483c57607f821691505b602082108103614873577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b8082018082111561488c5761488c61479b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f608082840312156148cf575f80fd5b6148d76143e3565b823581526020830135602082015260408301356148f38161418c565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036149275761492761479b565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149615761496161479b565b5060010190565b8181038181111561488c5761488c61479b565b808202811582820484141761488c5761488c61479b565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6149f2604083018486614992565b95945050505050565b5f60208284031215614a0b575f80fd5b81516141668161418c565b5f60208284031215614a26575f80fd5b8151614166816142ef565b601f821115613331575f81815260208120601f850160051c81016020861015614a575750805b601f850160051c820191505b81811015612cfd57828155600101614a63565b815167ffffffffffffffff811115614a9057614a906143b6565b614aa481614a9e8454614828565b84614a31565b602080601f831160018114614af6575f8415614ac05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612cfd565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b4257888601518255948401946001909101908401614b23565b5085821015614b7e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f614ba0606083018661410b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156147e9576147e961479b565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614c1f575f80fd5b9190910192915050565b5f60808236031215614c39575f80fd5b614c416143e3565b823567ffffffffffffffff811115614c57575f80fd5b614c63368286016144a0565b825250602083013560208201526040830135614c7e8161418c565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614cea60c083018461410b565b98975050505050505050565b61ffff8181168382160190808211156147e9576147e961479b565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614d79816003860160208c016140e9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dbc816017840160208b016140e9565b808201915050818660f81b16601782015284519150614de28260188301602088016140e9565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614e5b816003860160208c016140e9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614e9e816017840160208b016140e9565b808201915050818660f01b16601782015284519150614ec48260198301602088016140e9565b016019019998505050505050505050565b5f8651614ee6818460208b016140e9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614f74606083018486614992565b9695505050505050565b5f60208284031215614f8e575f80fd5b815167ffffffffffffffff811115614fa4575f80fd5b8201601f81018413614fb4575f80fd5b8051614fc26144bd8261445b565b818152856020838501011115614fd6575f80fd5b6149f28260208301602086016140e9565b5f8060408385031215614ff8575f80fd5b82516150038161416d565b6020840151909250615014816141ac565b809150509250929050565b5f8251614c1f8184602087016140e956fea26469706673582212208f14e95d711e34ab8ce58024a58ae32be4d80a1ebbc48bf76219efb04a89124264736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610319575f3560e01c80636ff512cc116101a8578063b910e0f9116100f3578063d7bc90ff1161009e578063e7a7ed0211610079578063e7a7ed0214610850578063eaeb077b14610864578063f35dda4714610877578063f851a4401461087f575f80fd5b8063d7bc90ff146107fe578063e46761c414610809578063e57a0b4c14610830575f80fd5b8063c89e42df116100ce578063c89e42df146107a4578063cfa8ed47146107b7578063d02103ca146107d7575f80fd5b8063b910e0f914610761578063c754c7ed14610774578063c7fffd4b1461079c575f80fd5b80639e00187711610153578063a652f26c1161012e578063a652f26c1461072f578063ada8f91914610742578063b0afe15414610755575f80fd5b80639e001877146106da5780639f26f840146106f5578063a3c573eb14610708575f80fd5b80637cd76b8b116101835780637cd76b8b146106ac5780638c3d7301146106bf57806391cafe32146106c7575f80fd5b80636ff512cc1461064a578063712570221461065d5780637a5460c514610670575f80fd5b806340b5de6c1161026857806352bdeb6d11610213578063676870d2116101ee578063676870d21461061a5780636b8616ce146106225780636e05d2cd14610641575f80fd5b806352bdeb6d146105c3578063542028d5146105ff578063669adece14610607575f80fd5b806349b7b8021161024357806349b7b802146105545780634c21fef31461057b5780634e487706146105b0575f80fd5b806340b5de6c146104bb57806342308fab14610513578063456052671461051b575f80fd5b806326782247116102c857806332c2d153116102a357806332c2d1531461044b5780633c351e101461045e5780633cbc795b1461047e575f80fd5b806326782247146103d35780632acdc2b6146104185780632c111c061461042b575f80fd5b8063107bf28c116102f8578063107bf28c1461039c57806311e892d4146103a4578063165e8a8d146103be575f80fd5b8062d0295d1461031d578063035089631461033857806305835f3714610353575b5f80fd5b6103256108a4565b6040519081526020015b60405180910390f35b610340602081565b60405161ffff909116815260200161032f565b61038f6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161032f9190614154565b61038f6109aa565b6103ac60f981565b60405160ff909116815260200161032f565b6103d16103cc36600461421d565b610a36565b005b6001546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161032f565b6103d16104263660046142fc565b6113bb565b6008546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6103d1610459366004614317565b6114d9565b6009546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104a69074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161032f565b6104e27fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161032f565b610325602481565b60075461053b9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161032f565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b603c546105a09074010000000000000000000000000000000000000000900460ff1681565b604051901515815260200161032f565b6103d16105be366004614356565b6115a8565b61038f6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61038f6117b7565b6103d1610615366004614371565b6117c4565b610340601f81565b610325610630366004614356565b60066020525f908152604090205481565b61032560055481565b6103d161065836600461439b565b61187b565b6103d161066b3660046144f2565b611944565b61038f6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103d16106ba36600461439b565b611efd565b6103d1611fc6565b6103d16106d536600461439b565b612098565b6103f373a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103d16107033660046145da565b6121b0565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b61038f61073d366004614619565b6127f4565b6103d161075036600461439b565b612bd2565b6103256405ca1ab1e081565b6103d161076f36600461468a565b612c9b565b60075461053b90700100000000000000000000000000000000900467ffffffffffffffff1681565b6103ac60e481565b6103d16107b236600461470a565b612d05565b6002546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b610325635ca1ab1e81565b6103f37f000000000000000000000000000000000000000000000000000000000000000081565b603c546103f39073ffffffffffffffffffffffffffffffffffffffff1681565b60075461053b9067ffffffffffffffff1681565b6103d161087236600461473c565b612d97565b6103ac601b81565b5f546103f39062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610930573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109549190614784565b6007549091505f9061097e9067ffffffffffffffff680100000000000000008204811691166147c8565b67ffffffffffffffff169050805f03610999575f9250505090565b6109a381836147f0565b9250505090565b600480546109b790614828565b80601f01602080910402602001604051908101604052809291908181526020018280546109e390614828565b8015610a2e5780601f10610a0557610100808354040283529160200191610a2e565b820191905f5260205f20905b815481529060010190602001808311610a1157829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a87576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b865f819003610ac2576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115610afe576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b09602442614879565b8667ffffffffffffffff161115610b4c576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610bb1575f80fd5b505af1158015610bc3573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa158015610c57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7b9190614784565b905080610cb4576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015610f9a575f8e8e83818110610cf057610cf0614892565b905060800201803603810190610d0691906148bf565b604081015190915067ffffffffffffffff1615610ef35784610d278161490b565b9550505f815f0151826020015183604001518460600151604051602001610d8c9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114610e14576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84825f0151836020015184604001518e8660600151604051602001610ead969594939291909586526020860194909452604085019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060808501919091521b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166068830152607c820152609c0190565b60405160208183030381529060405280519060200120945060065f8767ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550610f87565b8051604080516020810187905290810191909152606080820188905260c08e901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012093505b5080610f9281614931565b915050610cd5565b5060075467ffffffffffffffff9081169084161115610fe5576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146110e2575f61100a83866147c8565b905061102067ffffffffffffffff821683614968565b91506110a17f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110596108a4565b611063919061497b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061325d565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b801561126b576111e4337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119b9190614784565b6111a5919061497b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613336565b603c546040517f3b51be4b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690633b51be4b9061123e908d908c908c906004016149d9565b5f6040518083038186803b158015611254575f80fd5b505afa158015611266573d5f803e3d5ffd5b505050505b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611307573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132b91906149fb565b90508a8414611366576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516113a291815260200190565b60405180910390a2505050505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611411576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c5474010000000000000000000000000000000000000000900460ff1615158115150361146b576040517f5f0e7abe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000831515021790556040517ff32a0473f809a720a4f8af1e50d353f1caf7452030626fdaac4273f5e6587f41905f90a150565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611548576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f59668460405161159b91815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146115fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611645576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d29190614a16565b6117335760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610611733576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109b790614828565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314611833576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146118d1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016117ac565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146119b3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff16158080156119d157505f54600160ff909116105b806119ea5750303b1580156119ea57505f5460ff166001145b611a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611ad7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611ae18561339a565b6009549091505f90611b2b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856127f4565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bca9190614784565b90505f808483858f611bdd600143614968565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611d23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4791906149fb565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508860039081611dd79190614a76565b506004611de48982614a76565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e604051611e8493929190614b8e565b60405180910390a15050505050508015611ef4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f53576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b603c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd331bd4c4cd1afecb94a225184bded161ff3213624ba4fb58c4f30c5a861144a906020016117ac565b60015473ffffffffffffffffffffffffffffffffffffffff163314612017576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146120ee576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661213d576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb906020016117ac565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906121ee575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612225576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612293573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b791906149fb565b6122c19190614bcc565b67ffffffffffffffff161115612303576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361233e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561237a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916123a291849168010000000000000000900416614879565b11156123da576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015612675575f87878381811061241557612415614892565b90506020028101906124279190614bed565b61243090614c29565b90508361243c8161490b565b825180516020918201208185015160408087015160608801519151959a509295505f946124a8948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114612530576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055612554600188614968565b84036125c35742600760109054906101000a900467ffffffffffffffff1684604001516125819190614bcc565b67ffffffffffffffff1611156125c3576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061266d90614931565b9150506123fa565b506126a37f0000000000000000000000000000000000000000000000000000000000000000846110596108a4565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612774908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612790573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b491906149fb565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f8760405160240161282696959493929190614c94565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036129765760f9601f83516128ba9190614cf6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016129609796959493929190614d11565b6040516020818303038152906040529050612a7a565b815161ffff10156129b3576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96129c2602083614cf6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612a679796959493929190614df3565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612ad8573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612b50576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90612b959084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614ed5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612c28576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016117ac565b603c5474010000000000000000000000000000000000000000900460ff16612cef576040517f821935b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cfd8686868686866135fc565b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612d5b576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612d678282614a76565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516117ac9190614154565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612dd5575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612e0c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e999190614a16565b15612ed0576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5e9190614784565b905082811115612f9a576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612fd6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613336565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613082573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a69190614784565b6007805491925067ffffffffffffffff909116905f6130c48361490b565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505085856040516130fb929190614f30565b6040519081900390208142613111600143614968565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613207576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612cfd565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061324d90849033908b908b90614f3f565b60405180910390a2505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526133319084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613e73565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526133949085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016132af565b50505050565b606073ffffffffffffffffffffffffffffffffffffffff8216156135f7576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613441573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526134869190810190614f7e565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061353c9190614fe7565b915091508163ffffffff165f146135b3576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556135f4565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60025473ffffffffffffffffffffffffffffffffffffffff16331461364d576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f819003613688576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156136c4576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6136cf602442614879565b8467ffffffffffffffff161115613712576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613777575f80fd5b505af1158015613789573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa15801561381d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138419190614784565b90508061387a576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015613b96575f8c8c838181106138b6576138b6614892565b90506020028101906138c89190614bed565b6138d190614c29565b8051805160209091012060408201519192509067ffffffffffffffff1615613ab157856138fd8161490b565b9650505f8183602001518460400151856060015160405160200161395f9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146139e7576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550613b81565b8151516201d4c01015613af0576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080613b8e90614931565b91505061389b565b5060075467ffffffffffffffff9081169084161115613be1576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614613c96575f613c0683866147c8565b9050613c1c67ffffffffffffffff821683614968565b9150613c557f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff166110596108a4565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b613d25337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015611177573d5f803e3d5ffd5b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015613dc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de591906149fb565b9050888414613e20576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051613e5c91815260200190565b60405180910390a250505050505050505050505050565b5f613ed4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613f7e9092919063ffffffff16565b8051909150156133315780806020019051810190613ef29190614a16565b613331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611a72565b6060612bca84845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051613fb0919061501f565b5f6040518083038185875af1925050503d805f8114613fea576040519150601f19603f3d011682016040523d82523d5f602084013e613fef565b606091505b50915091506140008783838761400b565b979650505050505050565b606083156140a05782515f036140995773ffffffffffffffffffffffffffffffffffffffff85163b614099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a72565b5081612bca565b612bca83838151156140b55781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a729190614154565b5f5b838110156141035781810151838201526020016140eb565b50505f910152565b5f81518084526141228160208601602086016140e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f614166602083018461410b565b9392505050565b63ffffffff8116811461417e575f80fd5b50565b80356135f78161416d565b67ffffffffffffffff8116811461417e575f80fd5b80356135f78161418c565b73ffffffffffffffffffffffffffffffffffffffff8116811461417e575f80fd5b80356135f7816141ac565b5f8083601f8401126141e8575f80fd5b50813567ffffffffffffffff8111156141ff575f80fd5b602083019150836020828501011115614216575f80fd5b9250929050565b5f805f805f805f8060c0898b031215614234575f80fd5b883567ffffffffffffffff8082111561424b575f80fd5b818b0191508b601f83011261425e575f80fd5b81358181111561426c575f80fd5b8c60208260071b8501011115614280575f80fd5b602083019a508099505061429660208c01614181565b97506142a460408c016141a1565b965060608b013595506142b960808c016141cd565b945060a08b01359150808211156142ce575f80fd5b506142db8b828c016141d8565b999c989b5096995094979396929594505050565b801515811461417e575f80fd5b5f6020828403121561430c575f80fd5b8135614166816142ef565b5f805f60608486031215614329575f80fd5b83356143348161418c565b925060208401359150604084013561434b816141ac565b809150509250925092565b5f60208284031215614366575f80fd5b81356141668161418c565b5f8060408385031215614382575f80fd5b823561438d8161418c565b946020939093013593505050565b5f602082840312156143ab575f80fd5b8135614166816141ac565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516080810167ffffffffffffffff81118282101715614406576144066143b6565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614453576144536143b6565b604052919050565b5f67ffffffffffffffff821115614474576144746143b6565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f8301126144af575f80fd5b81356144c26144bd8261445b565b61440c565b8181528460208386010111156144d6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215614507575f80fd5b8635614512816141ac565b95506020870135614522816141ac565b945060408701356145328161416d565b93506060870135614542816141ac565b9250608087013567ffffffffffffffff8082111561455e575f80fd5b61456a8a838b016144a0565b935060a089013591508082111561457f575f80fd5b5061458c89828a016144a0565b9150509295509295509295565b5f8083601f8401126145a9575f80fd5b50813567ffffffffffffffff8111156145c0575f80fd5b6020830191508360208260051b8501011115614216575f80fd5b5f80602083850312156145eb575f80fd5b823567ffffffffffffffff811115614601575f80fd5b61460d85828601614599565b90969095509350505050565b5f805f806080858703121561462c575f80fd5b84356146378161416d565b93506020850135614647816141ac565b925060408501356146578161416d565b9150606085013567ffffffffffffffff811115614672575f80fd5b61467e878288016144a0565b91505092959194509250565b5f805f805f8060a0878903121561469f575f80fd5b863567ffffffffffffffff8111156146b5575f80fd5b6146c189828a01614599565b90975095505060208701356146d58161416d565b935060408701356146e58161418c565b92506060870135915060808701356146fc816141ac565b809150509295509295509295565b5f6020828403121561471a575f80fd5b813567ffffffffffffffff811115614730575f80fd5b612bca848285016144a0565b5f805f6040848603121561474e575f80fd5b833567ffffffffffffffff811115614764575f80fd5b614770868287016141d8565b909790965060209590950135949350505050565b5f60208284031215614794575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156147e9576147e961479b565b5092915050565b5f82614823577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061483c57607f821691505b602082108103614873577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b8082018082111561488c5761488c61479b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f608082840312156148cf575f80fd5b6148d76143e3565b823581526020830135602082015260408301356148f38161418c565b60408201526060928301359281019290925250919050565b5f67ffffffffffffffff8083168181036149275761492761479b565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149615761496161479b565b5060010190565b8181038181111561488c5761488c61479b565b808202811582820484141761488c5761488c61479b565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201525f6149f2604083018486614992565b95945050505050565b5f60208284031215614a0b575f80fd5b81516141668161418c565b5f60208284031215614a26575f80fd5b8151614166816142ef565b601f821115613331575f81815260208120601f850160051c81016020861015614a575750805b601f850160051c820191505b81811015612cfd57828155600101614a63565b815167ffffffffffffffff811115614a9057614a906143b6565b614aa481614a9e8454614828565b84614a31565b602080601f831160018114614af6575f8415614ac05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612cfd565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015614b4257888601518255948401946001909101908401614b23565b5085821015614b7e57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f614ba0606083018661410b565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff8181168382160190808211156147e9576147e961479b565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614c1f575f80fd5b9190910192915050565b5f60808236031215614c39575f80fd5b614c416143e3565b823567ffffffffffffffff811115614c57575f80fd5b614c63368286016144a0565b825250602083013560208201526040830135614c7e8161418c565b6040820152606092830135928101929092525090565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152614cea60c083018461410b565b98975050505050505050565b61ffff8181168382160190808211156147e9576147e961479b565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614d79816003860160208c016140e9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614dbc816017840160208b016140e9565b808201915050818660f81b16601782015284519150614de28260188301602088016140e9565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614e5b816003860160208c016140e9565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614e9e816017840160208b016140e9565b808201915050818660f01b16601782015284519150614ec48260198301602088016140e9565b016019019998505050505050505050565b5f8651614ee6818460208b016140e9565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f614f74606083018486614992565b9695505050505050565b5f60208284031215614f8e575f80fd5b815167ffffffffffffffff811115614fa4575f80fd5b8201601f81018413614fb4575f80fd5b8051614fc26144bd8261445b565b818152856020838501011115614fd6575f80fd5b6149f28260208301602086016140e9565b5f8060408385031215614ff8575f80fd5b82516150038161416d565b6020840151909250615014816141ac565b809150509250929050565b5f8251614c1f8184602087016140e956fea26469706673582212208f14e95d711e34ab8ce58024a58ae32be4d80a1ebbc48bf76219efb04a89124264736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVM.json b/compiled-contracts/PolygonZkEVM.json
index 4e967a181..73789aacc 100644
--- a/compiled-contracts/PolygonZkEVM.json
+++ b/compiled-contracts/PolygonZkEVM.json
@@ -1711,8 +1711,8 @@
"type": "function"
}
],
- "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220037883250178a4dbbb3550eba18a465d36ff27719a1da48e547cafff0383598464736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea2646970667358221220037883250178a4dbbb3550eba18a465d36ff27719a1da48e547cafff0383598464736f6c63430008140033",
+ "bytecode": "0x61014060405234801562000011575f80fd5b5060405162005f6438038062005f648339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051615d74620001f05f395f818161068201528181610dd3015261311d01525f81816107ee0152610da901525f81816107b401528181611d60015281816137ae0152614c0001525f818161095901528181610f45015281816111100152818161196d0152818161212e0152818161398f01526146d801525f8181610a0601528181614041015261448f01525f81816108a901528181611d2e0152818161261301528181613964015261412d0152615d745ff3fe608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea26469706673582212207601237f211900340462d308ec23f21cf56fdd8a6a63dd46586a4037175deeee64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106103a9575f3560e01c8063841b24d7116101ea578063c754c7ed11610114578063e7a7ed02116100a9578063f14916d611610079578063f14916d614610a68578063f2fde38b14610a7b578063f851a44014610a8e578063f8b823e414610aae575f80fd5b8063e7a7ed02146109d1578063e8bf92ed14610a01578063eaeb077b14610a28578063ed6b010414610a3b575f80fd5b8063d2e129f9116100e4578063d2e129f91461097b578063d8d1091b1461098e578063d939b315146109a1578063dbc16976146109c9575f80fd5b8063c754c7ed146108e6578063c89e42df14610912578063cfa8ed4714610925578063d02103ca14610954575f80fd5b8063a3c573eb1161018a578063b4d63f581161015a578063b4d63f581461083e578063b6b0b097146108a4578063ba58ae39146108cb578063c0ed84e0146108de575f80fd5b8063a3c573eb146107af578063ada8f919146107d6578063adc879e9146107e9578063afd23cbe14610810575f80fd5b806399f5634e116101c557806399f5634e1461076e5780639aa972a3146107765780639c9f3dfe14610789578063a066215c1461079c575f80fd5b8063841b24d7146107185780638c3d7301146107485780638da5cb5b14610750575f80fd5b80634a1a89a7116102d6578063621dd4111161026b5780637215541a1161023b5780637215541a146106565780637fcb365314610669578063831c7ead1461067d578063837a4738146106a4575f80fd5b8063621dd411146106095780636b8616ce1461061c5780636ff512cc1461063b578063715018a61461064e575f80fd5b8063542028d5116102a6578063542028d5146105de5780635e9145c9146105e65780635ec91958146105f95780636046916914610601575f80fd5b80634a1a89a71461056b5780634a910e6a1461058b5780634e4877061461059e5780635392c5e0146105b1575f80fd5b8063298789831161034c578063394218e91161031c578063394218e9146104fc578063423fa8561461050f578063456052671461052f578063458c047714610557575f80fd5b806329878983146104975780632b0006fa146104c35780632c1f816a146104d6578063383b3be8146104e9575f80fd5b80631816b7e5116103875780631816b7e51461041657806319d8ac611461042b578063220d78991461043f5780632678224714610452575f80fd5b80630a0d9fbe146103ad578063107bf28c146103e457806315064c96146103f9575b5f80fd5b606f546103c690610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103ec610ab7565b6040516103db919061521a565b606f546104069060ff1681565b60405190151581526020016103db565b610429610424366004615233565b610b43565b005b6073546103c69067ffffffffffffffff1681565b6103ec61044d36600461526b565b610c5b565b607b546104729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016103db565b6074546104729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104296104d13660046152cb565b610e31565b6104296104e436600461532f565b610ffb565b6104066104f73660046153a4565b611203565b61042961050a3660046153a4565b611258565b6073546103c69068010000000000000000900467ffffffffffffffff1681565b6073546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546103c69067ffffffffffffffff1681565b6079546103c69068010000000000000000900467ffffffffffffffff1681565b6104296105993660046153a4565b6113dc565b6104296105ac3660046153a4565b61148f565b6105d06105bf3660046153a4565b60756020525f908152604090205481565b6040519081526020016103db565b6103ec611613565b6104296105f4366004615428565b611620565b610429611e19565b6105d0611f18565b6104296106173660046152cb565b611f2d565b6105d061062a3660046153a4565b60716020525f908152604090205481565b610429610649366004615478565b6122ab565b610429612380565b6104296106643660046153a4565b612393565b6074546103c69067ffffffffffffffff1681565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b6106ec6106b2366004615491565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016103db565b6079546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b610429612500565b60335473ffffffffffffffffffffffffffffffffffffffff16610472565b6105d06125cc565b61042961078436600461532f565b61271f565b6104296107973660046153a4565b6127cf565b6104296107aa3660046153a4565b61294b565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296107e4366004615478565b612a51565b6103c67f000000000000000000000000000000000000000000000000000000000000000081565b606f5461082b906901000000000000000000900461ffff1681565b60405161ffff90911681526020016103db565b61087e61084c3660046153a4565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016103db565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104066108d9366004615491565b612b15565b6103c6612b9d565b607b546103c69074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b61042961092036600461557c565b612bf0565b606f54610472906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b6104296109893660046155ec565b612c7d565b61042961099c366004615697565b6131c0565b6079546103c690700100000000000000000000000000000000900467ffffffffffffffff1681565b61042961375b565b6073546103c6907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104727f000000000000000000000000000000000000000000000000000000000000000081565b610429610a363660046156d6565b61382f565b607b54610406907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b610429610a76366004615478565b613c1f565b610429610a89366004615478565b613cf1565b607a546104729073ffffffffffffffffffffffffffffffffffffffff1681565b6105d060705481565b60778054610ac49061571e565b80601f0160208091040260200160405190810160405280929190818152602001828054610af09061571e565b8015610b3b5780601f10610b1257610100808354040283529160200191610b3b565b820191905f5260205f20905b815481529060010190602001808311610b1e57829003601f168201915b505050505081565b607a5473ffffffffffffffffffffffffffffffffffffffff163314610b94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff161080610bad57506103ff8161ffff16115b15610be4576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590610c8e575081155b15610cc5576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80610cfc576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0584612b15565b610d3b576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610e8e576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9c868686868686613da5565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615610f1657607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015610f9b575f80fd5b505af1158015610fad573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611058576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61106787878787878787614160565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156110e157607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611166575f80fd5b505af1158015611178573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611246927001000000000000000000000000000000009092048116911661579c565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146112a9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156112f0576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661135f5760795467ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169082161061135f576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a190602001610c50565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461148357606f5460ff1615611444576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61144d81611203565b611483576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61148c8161458f565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146114e0576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611527576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661159257607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610611592576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b90602001610c50565b60768054610ac49061571e565b606f5460ff161561165d576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146116bd576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036116f8576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611734576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b86811015611b7c575f8a8a8381811061179a5761179a6157c4565b90506020028101906117ac91906157f1565b6117b59061582d565b8051805160209091012060608201519192509067ffffffffffffffff161561192a57856117e1816158b7565b9650505f818360200151846060015160405160200161183893929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152607190935291205490915081146118c0576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f908152607160205260408082209190915560608501519085015190821691161015611924576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611a64565b6020820151158015906119ee575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af11580156119c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ec91906158dd565b155b15611a25576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c01015611a64576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff161080611a97575042826040015167ffffffffffffffff16115b15611ace576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c016040516020818303038152906040528051906020012094508160400151975050508080611b74906158f4565b91505061177f565b50611b87868561579c565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115611bf0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611bfb828561592b565b611c0f9067ffffffffffffffff168861594c565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c8416911617930292909217905590915082811690851614611d0457607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b611d56333083607054611d17919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061479c565b611d5e61487e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611dc3575f80fd5b505af1158015611dd5573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611e6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16611ec6576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064611f28919061595f565b905090565b606f5460ff1615611f6a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292611fb69278010000000000000000000000000000000000000000000000009091048116911661579c565b67ffffffffffffffff161115611ff8576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612005868661592b565b67ffffffffffffffff161115612047576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612055868686868686613da5565b61205e8461492d565b607954700100000000000000000000000000000000900467ffffffffffffffff165f0361219f57607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f90815260756020526040902083905560795416156120ff57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612184575f80fd5b505af1158015612196573d5f803e3d5ffd5b5050505061226d565b6121a761487e565b6079805467ffffffffffffffff16905f6121c0836158b7565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001610feb565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146122fc576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c50565b612388614b07565b6123915f614b88565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146124f8575f6123bb612b9d565b90508067ffffffffffffffff168267ffffffffffffffff161161240a576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff680100000000000000009091048116908316118061244f575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15612486576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916124b49162093a80911661579c565b67ffffffffffffffff1611156124f6576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61148c614bfe565b607b5473ffffffffffffffffffffffffffffffffffffffff163314612551576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612658573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267c91906158dd565b90505f612687612b9d565b60735467ffffffffffffffff6801000000000000000082048116916126df917001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041661592b565b6126e9919061579c565b6126f3919061592b565b67ffffffffffffffff169050805f0361270e575f9250505090565b61271881836159a3565b9250505090565b606f5460ff161561275c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61276b87878787878787614160565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a16127c6614bfe565b50505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612820576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115612867576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166128ce5760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106128ce576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c7590602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461299c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156129e3576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c2890602001610c50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c50565b5f67ffffffff0000000167ffffffffffffffff8316108015612b4c575067ffffffff00000001604083901c67ffffffffffffffff16105b8015612b6d575067ffffffff00000001608083901c67ffffffffffffffff16105b8015612b84575067ffffffff0000000160c083901c105b15612b9157506001919050565b505f919050565b919050565b6079545f9067ffffffffffffffff1615612bdf575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612c41576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6076612c4d8282615a03565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c50919061521a565b5f54610100900460ff1615808015612c9b57505f54600160ff909116105b80612cb45750303b158015612cb457505f5460ff166001145b612d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015612da1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b612dae6020880188615478565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612e036040880160208901615478565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055612e686080880160608901615478565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076612ef28682615a03565b506077612eff8582615a03565b5062093a80612f146060890160408a016153a4565b67ffffffffffffffff161115612f56576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f6660608801604089016153a4565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80612fc860a0890160808a016153a4565b67ffffffffffffffff16111561300a576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61301a60a08801608089016153a4565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c01000000000006978000000000000000000000000000000000000000001790556130f9614c81565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f0000000000000000000000000000000000000000000000000000000000000000858560405161314e9493929190615b62565b60405180910390a180156127c6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561321d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff161561325a576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613295576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156132d1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff7801000000000000000000000000000000000000000000000000820481169161331c918491700100000000000000000000000000000000900416615b99565b1115613354576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b848110156135f9575f8787838181106133b2576133b26157c4565b90506020028101906133c49190615bac565b6133cd90615bde565b9050836133d9816158b7565b825180516020918201208185015160408087015190519499509194505f9361343a9386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146134c2576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f908152607160205260408120556134e660018961594c565b84036135555742607b60149054906101000a900467ffffffffffffffff168460400151613513919061579c565b67ffffffffffffffff161115613555576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945050505080806135f1906158f4565b915050613397565b50613604848461579c565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137ac576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613811575f80fd5b505af1158015613823573d5f803e3d5ffd5b50505050612391614d20565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff161561388c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16156138c9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6138d2611f18565b90508181111561390e576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138883111561394a576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398c73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461479c565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1a91906158dd565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16906018613a54836158b7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051613a8b929190615c57565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303613bb9576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a2613c18565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93182338888604051613c0f9493929190615c66565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613c70576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca90602001610c50565b613cf9614b07565b73ffffffffffffffffffffffffffffffffffffffff8116613d9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401612d3c565b61148c81614b88565b5f80613daf612b9d565b905067ffffffffffffffff881615613e7e5760795467ffffffffffffffff9081169089161115613e0b576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614613e78576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50613f1e565b67ffffffffffffffff87165f90815260756020526040902054915081613ed0576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115613f1e576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611613f6b576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f798888888689610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051613fad9190615c9b565b602060405180830381855afa158015613fc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613feb91906158dd565b613ff59190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161407791899190600401615cbf565b602060405180830381865afa158015614092573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b69190615cf9565b6140ec576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614154336140fa858b61592b565b67ffffffffffffffff1661410c6125cc565b614116919061595f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190614dae565b50505050505050505050565b5f67ffffffffffffffff88161561422c5760795467ffffffffffffffff90811690891611156141bb576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614614226576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506142c7565b5067ffffffffffffffff85165f908152607560205260409020548061427d576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff90811690871611156142c7576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff90811690881611806142f957508767ffffffffffffffff168767ffffffffffffffff1611155b80614320575060795467ffffffffffffffff68010000000000000000909104811690881611155b15614357576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f908152607860205260409020546801000000000000000090048116908616146143b9576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6143c78787878588610c5b565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016002836040516143fb9190615c9b565b602060405180830381855afa158015614416573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061443991906158dd565b6144439190615cac565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a916144c591889190600401615cbf565b602060405180830381865afa1580156144e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145049190615cf9565b61453a576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614154576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff6801000000000000000090910481169082161115806145c9575060795467ffffffffffffffff908116908216115b15614600576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b15801561472e575f80fd5b505af1158015614740573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e846002015460405161478f91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526148789085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152614e09565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115612391576079545f906148c69068010000000000000000900467ffffffffffffffff16600161579c565b90506148d181611203565b1561148c576079545f906002906148f390849067ffffffffffffffff1661592b565b6148fd9190615d18565b614907908361579c565b905061491281611203565b15614924576149208161458f565b5050565b6149208261458f565b5f614936612b9d565b9050815f80614945848461592b565b606f5467ffffffffffffffff91821692505f91614968916101009004164261594c565b90505b8467ffffffffffffffff168467ffffffffffffffff16146149f25767ffffffffffffffff8085165f90815260726020526040902060018101549091168210156149d057600181015468010000000000000000900467ffffffffffffffff1694506149ec565b6149da868661592b565b67ffffffffffffffff169350506149f2565b5061496b565b5f6149fd848461594c565b905083811015614a5457808403600c8111614a185780614a1b565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a6070540281614a4a57614a4a615976565b0460705550614ac3565b838103600c8111614a655780614a68565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a76400000281614a9e57614a9e615976565b04905080607054670de0b6b3a76400000281614abc57614abc615976565b0460705550505b683635c9adc5dea000006070541115614ae857683635c9adc5dea000006070556127c6565b633b9aca0060705410156127c657633b9aca0060705550505050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401612d3c565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015614c63575f80fd5b505af1158015614c75573d5f803e3d5ffd5b50505050612391614f14565b5f54610100900460ff16614d17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401612d3c565b61239133614b88565b606f5460ff16614d5c576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052614e049084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064016147f6565b505050565b5f614e6a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16614fa69092919063ffffffff16565b805190915015614e045780806020019051810190614e889190615cf9565b614e04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401612d3c565b606f5460ff1615614f51576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060614fb484845f85614fbc565b949350505050565b60608247101561504e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401612d3c565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516150769190615c9b565b5f6040518083038185875af1925050503d805f81146150b0576040519150601f19603f3d011682016040523d82523d5f602084013e6150b5565b606091505b50915091506150c6878383876150d1565b979650505050505050565b606083156151665782515f0361515f5773ffffffffffffffffffffffffffffffffffffffff85163b61515f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401612d3c565b5081614fb4565b614fb4838381511561517b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c919061521a565b5f5b838110156151c95781810151838201526020016151b1565b50505f910152565b5f81518084526151e88160208601602086016151af565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61522c60208301846151d1565b9392505050565b5f60208284031215615243575f80fd5b813561ffff8116811461522c575f80fd5b803567ffffffffffffffff81168114612b98575f80fd5b5f805f805f60a0868803121561527f575f80fd5b61528886615254565b945061529660208701615254565b94979496505050506040830135926060810135926080909101359150565b8061030081018310156152c5575f80fd5b92915050565b5f805f805f806103a087890312156152e1575f80fd5b6152ea87615254565b95506152f860208801615254565b945061530660408801615254565b935060608701359250608087013591506153238860a089016152b4565b90509295509295509295565b5f805f805f805f6103c0888a031215615346575f80fd5b61534f88615254565b965061535d60208901615254565b955061536b60408901615254565b945061537960608901615254565b93506080880135925060a088013591506153968960c08a016152b4565b905092959891949750929550565b5f602082840312156153b4575f80fd5b61522c82615254565b5f8083601f8401126153cd575f80fd5b50813567ffffffffffffffff8111156153e4575f80fd5b6020830191508360208260051b85010111156153fe575f80fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612b98575f80fd5b5f805f6040848603121561543a575f80fd5b833567ffffffffffffffff811115615450575f80fd5b61545c868287016153bd565b909450925061546f905060208501615405565b90509250925092565b5f60208284031215615488575f80fd5b61522c82615405565b5f602082840312156154a1575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126154e4575f80fd5b813567ffffffffffffffff808211156154ff576154ff6154a8565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715615545576155456154a8565b8160405283815286602085880101111561555d575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f6020828403121561558c575f80fd5b813567ffffffffffffffff8111156155a2575f80fd5b614fb4848285016154d5565b5f8083601f8401126155be575f80fd5b50813567ffffffffffffffff8111156155d5575f80fd5b6020830191508360208285010111156153fe575f80fd5b5f805f805f80868803610120811215615603575f80fd5b60a0811215615610575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115615635575f80fd5b6156418a838b016154d5565b955060e0890135915080821115615656575f80fd5b6156628a838b016154d5565b9450610100890135915080821115615678575f80fd5b5061568589828a016155ae565b979a9699509497509295939492505050565b5f80602083850312156156a8575f80fd5b823567ffffffffffffffff8111156156be575f80fd5b6156ca858286016153bd565b90969095509350505050565b5f805f604084860312156156e8575f80fd5b833567ffffffffffffffff8111156156fe575f80fd5b61570a868287016155ae565b909790965060209590950135949350505050565b600181811c9082168061573257607f821691505b602082108103615769577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156157bd576157bd61576f565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112615823575f80fd5b9190910192915050565b5f6080823603121561583d575f80fd5b6040516080810167ffffffffffffffff8282108183111715615861576158616154a8565b816040528435915080821115615875575f80fd5b50615882368286016154d5565b8252506020830135602082015261589b60408401615254565b60408201526158ac60608401615254565b606082015292915050565b5f67ffffffffffffffff8083168181036158d3576158d361576f565b6001019392505050565b5f602082840312156158ed575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159245761592461576f565b5060010190565b67ffffffffffffffff8281168282160390808211156157bd576157bd61576f565b818103818111156152c5576152c561576f565b80820281158282048414176152c5576152c561576f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826159b1576159b1615976565b500490565b601f821115614e04575f81815260208120601f850160051c810160208610156159dc5750805b601f850160051c820191505b818110156159fb578281556001016159e8565b505050505050565b815167ffffffffffffffff811115615a1d57615a1d6154a8565b615a3181615a2b845461571e565b846159b6565b602080601f831160018114615a83575f8415615a4d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556159fb565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615b0b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152615b8f606083018486615b1b565b9695505050505050565b808201808211156152c5576152c561576f565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615823575f80fd5b5f60608236031215615bee575f80fd5b6040516060810167ffffffffffffffff8282108183111715615c1257615c126154a8565b816040528435915080821115615c26575f80fd5b50615c33368286016154d5565b82525060208301356020820152615c4c60408401615254565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f615b8f606083018486615b1b565b5f82516158238184602087016151af565b5f82615cba57615cba615976565b500690565b6103208101610300808584378201835f5b6001811015615cef578151835260209283019290910190600101615cd0565b5050509392505050565b5f60208284031215615d09575f80fd5b8151801515811461522c575f80fd5b5f67ffffffffffffffff80841680615d3257615d32615976565b9216919091049291505056fea26469706673582212207601237f211900340462d308ec23f21cf56fdd8a6a63dd46586a4037175deeee64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMBridge.json b/compiled-contracts/PolygonZkEVMBridge.json
index 0a1bcd5c1..99a0e3182 100644
--- a/compiled-contracts/PolygonZkEVMBridge.json
+++ b/compiled-contracts/PolygonZkEVMBridge.json
@@ -776,8 +776,8 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212204bf5435ffe476836b9a1ac833105603f477cc35a320609487acf64f513eae07564736f6c63430008140033",
- "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212204bf5435ffe476836b9a1ac833105603f477cc35a320609487acf64f513eae07564736f6c63430008140033",
+ "bytecode": "0x608060405234801561000f575f80fd5b50615b1f8061001d5f395ff3fe60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220991aea41966384d328d04f6fe159faeb7c73b2b4e1ff56268f8b5e388f63cf8064736f6c63430008140033",
+ "deployedBytecode": "0x60806040526004361062000197575f3560e01c8063647c576c11620000e2578063be5831c71162000086578063dbc16976116200005e578063dbc16976146200061a578063ee25560b1462000631578063fb5708341462000660575f80fd5b8063be5831c71462000591578063cd58657914620005cc578063d02103ca14620005e3575f80fd5b80639e34070f11620000ba5780639e34070f14620004f1578063aaa13cc21462000534578063bab161bf1462000558575f80fd5b8063647c576c146200047157806379e2cf97146200049557806381b1c17414620004ac575f80fd5b80632d2c9d94116200014a57806334ac9cf2116200012257806334ac9cf2146200033a5780633ae0504714620003685780633e197043146200037f575f80fd5b80632d2c9d9414620002695780632dfdf0b5146200028d578063318aee3d14620002b3575f80fd5b806322e95f2c116200017e57806322e95f2c14620001e4578063240ff378146200022e5780632cffd02e1462000245575f80fd5b806315064c96146200019b5780632072f6c514620001cb575b5f80fd5b348015620001a7575f80fd5b50606854620001b69060ff1681565b60405190151581526020015b60405180910390f35b348015620001d7575f80fd5b50620001e262000684565b005b348015620001f0575f80fd5b5062000208620002023660046200323f565b620006e2565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001c2565b620001e26200023f366004620032cf565b62000784565b34801562000251575f80fd5b50620001e26200026336600462003360565b620009ab565b34801562000275575f80fd5b50620001e26200028736600462003360565b62000f30565b34801562000299575f80fd5b50620002a460535481565b604051908152602001620001c2565b348015620002bf575f80fd5b5062000308620002d13660046200343e565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620001c2565b34801562000346575f80fd5b50606c54620002089073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000374575f80fd5b50620002a462001130565b3480156200038b575f80fd5b50620002a46200039d36600462003472565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200047d575f80fd5b50620001e26200048f366004620034f7565b62001215565b348015620004a1575f80fd5b50620001e26200145e565b348015620004b8575f80fd5b5062000208620004ca36600462003544565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620004fd575f80fd5b50620001b66200050f36600462003544565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b34801562000540575f80fd5b5062000208620005523660046200355c565b62001498565b34801562000564575f80fd5b506068546200057b90610100900463ffffffff1681565b60405163ffffffff9091168152602001620001c2565b3480156200059d575f80fd5b506068546200057b90790100000000000000000000000000000000000000000000000000900463ffffffff1681565b620001e2620005dd36600462003609565b62001682565b348015620005ef575f80fd5b50606854620002089065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000626575f80fd5b50620001e262001bd4565b3480156200063d575f80fd5b50620002a46200064f36600462003544565b60696020525f908152604090205481565b3480156200066c575f80fd5b50620001b66200067e366004620036a5565b62001c30565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620006d6576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062001d18565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620007c2576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620007e85750600263ffffffff861610155b1562000820576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620008769998979695949392919062003736565b60405180910390a1620009936200098d6001606860019054906101000a900463ffffffff16338989348989604051620008b1929190620037b0565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001dab565b8215620009a457620009a462001ebf565b5050505050565b60685460ff1615620009e9576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620009ff8b8b8b8b8b8b8b8b8b8b8b5f62001f8f565b73ffffffffffffffffffffffffffffffffffffffff861662000ad757604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000a53919062003810565b5f6040518083038185875af1925050503d805f811462000a8f576040519150601f19603f3d011682016040523d82523d5f602084013e62000a94565b606091505b505090508062000ad0576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5062000eb8565b60685463ffffffff61010090910481169088160362000b195762000b1373ffffffffffffffffffffffffffffffffffffffff871685856200217a565b62000eb8565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000e2f575f808062000beb868801886200391f565b9250925092505f8584848460405162000c0490620031f8565b62000c1293929190620039db565b8190604051809103905ff590508015801562000c30573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000ca3575f80fd5b505af115801562000cb6573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000e1d95949392919062003a17565b60405180910390a15050505062000eb5565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562000e9d575f80fd5b505af115801562000eb0573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff161562000f6e576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000f858b8b8b8b8b8b8b8b8b8b8b600162001f8f565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a868660405160240162000fb7949392919062003a5e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200103a919062003810565b5f6040518083038185875af1925050503d805f811462001076576040519150601f19603f3d011682016040523d82523d5f602084013e6200107b565b606091505b5050905080620010b7576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200120c578083901c6001166001036200119d576033816020811062001169576200116962003aa5565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350620011ca565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620012039062003aff565b9150506200113a565b50919392505050565b5f54610100900460ff16158080156200123457505f54600160ff909116105b806200124f5750303b1580156200124f57505f5460ff166001145b620012e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156200133e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918416919091179055620013f562002250565b801562001458575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620006e057620006e062001ebf565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b3083604051806020016200152c90620031f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262001577908d908d908d908d908d9060200162003b39565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620015b5929160200162003b79565b604051602081830303815290604052805190602001206040516020016200163e94939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60685460ff1615620016c0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620016ca620022f2565b60685463ffffffff888116610100909204161480620016f05750600263ffffffff881610155b1562001728576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff88166200178c5788341462001783576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f925062001a79565b3415620017c5576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620018ae576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b15801562001884575f80fd5b505af115801562001897573d5f803e3d5ffd5b5050505080602001519450805f0151935062001a77565b8515620018c357620018c3898b898962002367565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156200192e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001954919062003bab565b90506200197a73ffffffffffffffffffffffffffffffffffffffff8b1633308e6200287a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015620019e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001a0b919062003bab565b905062001a19828262003bc3565b6068548c9850610100900463ffffffff169650935062001a3987620028da565b62001a448c620029ee565b62001a4f8d62002af7565b60405160200162001a6393929190620039db565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e868860535460405162001aba98979695949392919062003bd9565b60405180910390a162001bac6200098d5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b861562001bbd5762001bbd62001ebf565b5050505062001bcb60018055565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff16331462001c26576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006e062002bf5565b5f84815b602081101562001d0a57600163ffffffff8616821c8116900362001ca65785816020811062001c675762001c6762003aa5565b60200201358260405160200162001c88929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001cf5565b8186826020811062001cbc5762001cbc62003aa5565b602002013560405160200162001cdc929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001d018162003aff565b91505062001c34565b50821490505b949350505050565b60685460ff161562001d56576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001dbc6020600262003d88565b62001dc8919062003bc3565b6053541062001e03576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001e149062003aff565b918290555090505f5b602081101562001eaf578082901c60011660010362001e5557826033826020811062001e4d5762001e4d62003aa5565b015550505050565b6033816020811062001e6b5762001e6b62003aa5565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001ea69062003aff565b91505062001e1d565b5062001eba62003d95565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001f4562001130565b6040518263ffffffff1660e01b815260040162001f6491815260200190565b5f604051808303815f87803b15801562001f7c575f80fd5b505af115801562001458573d5f803e3d5ffd5b62001fa08b63ffffffff1662002c84565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af11580156200203f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002065919062003bab565b9050805f03620020a0576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff8881166101009092041614620020ea576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff16620021075750896200210a565b508a5b620021336200212a848c8c8c8c8c8c8c604051620008b1929190620037b0565b8f8f8462001c30565b6200216a576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001eba9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915262002ce8565b5f54610100900460ff16620022e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b620006e062002dfa565b60026001540362002360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401620012d8565b6002600155565b5f62002377600482848662003dc2565b620023829162003deb565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601620025fc575f808080808080620023e4896004818d62003dc2565b810190620023f3919062003e34565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002467576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff86163014620024b7576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a8514620024f1576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e1691620025ac919062003810565b5f604051808303815f865af19150503d805f8114620025e7576040519150601f19603f3d011682016040523d82523d5f602084013e620025ec565b606091505b50505050505050505050620009a4565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002678576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806200268f8a6004818e62003dc2565b8101906200269e919062003e8a565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002714576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002764576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002828919062003810565b5f604051808303815f865af19150503d805f811462002863576040519150601f19603f3d011682016040523d82523d5f602084013e62002868565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620014589085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401620021cd565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff8616916200295d919062003810565b5f60405180830381855afa9150503d805f811462002997576040519150601f19603f3d011682016040523d82523d5f602084013e6200299c565b606091505b509150915081620029e3576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001d10565b62001d108162002e92565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002a71919062003810565b5f60405180830381855afa9150503d805f811462002aab576040519150601f19603f3d011682016040523d82523d5f602084013e62002ab0565b606091505b509150915081620029e3576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001d10565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff86169162002b79919062003810565b5f60405180830381855afa9150503d805f811462002bb3576040519150601f19603f3d011682016040523d82523d5f602084013e62002bb8565b606091505b509150915081801562002bcc575080516020145b62002bd957601262001d10565b8080602001905181019062001d10919062003f11565b60018055565b60685460ff1662002c32576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003620009a4576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002d4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200307d9092919063ffffffff16565b80519091501562001eba578080602001905181019062002d6c919062003f2f565b62001eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401620012d8565b5f54610100900460ff1662002bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401620012d8565b6060604082511062002eb457818060200190518101906200077e919062003f4d565b81516020036200303f575f5b60208110801562002f0b575082818151811062002ee15762002ee162003aa5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b1562002f26578062002f1d8162003aff565b91505062002ec0565b805f0362002f6957505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff81111562002f865762002f86620037bf565b6040519080825280601f01601f19166020018201604052801562002fb1576020820181803683370190505b5090505f5b82811015620030375784818151811062002fd45762002fd462003aa5565b602001015160f81c60f81b82828151811062002ff45762002ff462003aa5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350806200302e8162003aff565b91505062002fb6565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b606062001d1084845f85855f808673ffffffffffffffffffffffffffffffffffffffff168587604051620030b2919062003810565b5f6040518083038185875af1925050503d805f8114620030ee576040519150601f19603f3d011682016040523d82523d5f602084013e620030f3565b606091505b5091509150620031068783838762003111565b979650505050505050565b60608315620031ab5782515f03620031a35773ffffffffffffffffffffffffffffffffffffffff85163b620031a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620012d8565b508162001d10565b62001d108383815115620031c25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012d8919062003fc8565b611b0d8062003fdd83390190565b803563ffffffff8116811462003078575f80fd5b73ffffffffffffffffffffffffffffffffffffffff811681146200323c575f80fd5b50565b5f806040838503121562003251575f80fd5b6200325c8362003206565b915060208301356200326e816200321a565b809150509250929050565b80151581146200323c575f80fd5b5f8083601f84011262003298575f80fd5b50813567ffffffffffffffff811115620032b0575f80fd5b602083019150836020828501011115620032c8575f80fd5b9250929050565b5f805f805f60808688031215620032e4575f80fd5b620032ef8662003206565b9450602086013562003301816200321a565b93506040860135620033138162003279565b9250606086013567ffffffffffffffff8111156200332f575f80fd5b6200333d8882890162003287565b969995985093965092949392505050565b8061040081018310156200077e575f80fd5b5f805f805f805f805f805f6105208c8e0312156200337c575f80fd5b620033888d8d6200334e565b9a50620033996104008d0162003206565b99506104208c013598506104408c01359750620033ba6104608d0162003206565b96506104808c0135620033cd816200321a565b9550620033de6104a08d0162003206565b94506104c08c0135620033f1816200321a565b93506104e08c013592506105008c013567ffffffffffffffff81111562003416575f80fd5b620034248e828f0162003287565b915080935050809150509295989b509295989b9093969950565b5f602082840312156200344f575f80fd5b81356200345c816200321a565b9392505050565b60ff811681146200323c575f80fd5b5f805f805f805f60e0888a03121562003489575f80fd5b8735620034968162003463565b9650620034a66020890162003206565b95506040880135620034b8816200321a565b9450620034c86060890162003206565b93506080880135620034da816200321a565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156200350a575f80fd5b620035158462003206565b9250602084013562003527816200321a565b9150604084013562003539816200321a565b809150509250925092565b5f6020828403121562003555575f80fd5b5035919050565b5f805f805f805f60a0888a03121562003573575f80fd5b6200357e8862003206565b9650602088013562003590816200321a565b9550604088013567ffffffffffffffff80821115620035ad575f80fd5b620035bb8b838c0162003287565b909750955060608a0135915080821115620035d4575f80fd5b50620035e38a828b0162003287565b9094509250506080880135620035f98162003463565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003620575f80fd5b6200362b8862003206565b965060208801356200363d816200321a565b955060408801359450606088013562003656816200321a565b93506080880135620036688162003279565b925060a088013567ffffffffffffffff81111562003684575f80fd5b620036928a828b0162003287565b989b979a50959850939692959293505050565b5f805f806104608587031215620036ba575f80fd5b84359350620036cd86602087016200334e565b9250620036de610420860162003206565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c0850152620037968285018789620036ef565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003808578181015183820152602001620037ee565b50505f910152565b5f825162003823818460208701620037ec565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620038775762003877620037bf565b604052919050565b5f67ffffffffffffffff8211156200389b576200389b620037bf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112620038d7575f80fd5b8135620038ee620038e8826200387f565b6200382d565b81815284602083860101111562003903575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003932575f80fd5b833567ffffffffffffffff808211156200394a575f80fd5b6200395887838801620038c7565b945060208601359150808211156200396e575f80fd5b506200397d86828701620038c7565b9250506040840135620035398162003463565b5f8151808452620039a9816020860160208601620037ec565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f620039ef606083018662003990565b828103602084015262003a03818662003990565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff80871660208401528086166040840152506080606083015262003106608083018486620036ef565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003a9b606083018486620036ef565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003b325762003b3262003ad2565b5060010190565b606081525f62003b4e606083018789620036ef565b828103602084015262003b63818688620036ef565b91505060ff831660408301529695505050505050565b5f835162003b8c818460208801620037ec565b83519083019062003ba2818360208801620037ec565b01949350505050565b5f6020828403121562003bbc575f80fd5b5051919050565b818103818111156200077e576200077e62003ad2565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c085015262003c388285018762003990565b925080851660e085015250509998505050505050505050565b600181815b8085111562003cb057817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003c945762003c9462003ad2565b8085161562003ca257918102915b93841c939080029062003c56565b509250929050565b5f8262003cc8575060016200077e565b8162003cd657505f6200077e565b816001811462003cef576002811462003cfa5762003d1a565b60019150506200077e565b60ff84111562003d0e5762003d0e62003ad2565b50506001821b6200077e565b5060208310610133831016604e8410600b841016171562003d3f575081810a6200077e565b62003d4b838362003c51565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562003d805762003d8062003ad2565b029392505050565b5f6200345c838362003cb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f808585111562003dd1575f80fd5b8386111562003dde575f80fd5b5050820193919092039150565b7fffffffff00000000000000000000000000000000000000000000000000000000813581811691600485101562003e2c5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a03121562003e4b575f80fd5b873562003e58816200321a565b9650602088013562003e6a816200321a565b955060408801359450606088013593506080880135620034da8162003463565b5f805f805f805f80610100898b03121562003ea3575f80fd5b883562003eb0816200321a565b9750602089013562003ec2816200321a565b96506040890135955060608901359450608089013562003ee28162003279565b935060a089013562003ef48162003463565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562003f22575f80fd5b81516200345c8162003463565b5f6020828403121562003f40575f80fd5b81516200345c8162003279565b5f6020828403121562003f5e575f80fd5b815167ffffffffffffffff81111562003f75575f80fd5b8201601f8101841362003f86575f80fd5b805162003f97620038e8826200387f565b81815285602083850101111562003fac575f80fd5b62003fbf826020830160208601620037ec565b95945050505050565b602081525f6200345c60208301846200399056fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a2646970667358221220991aea41966384d328d04f6fe159faeb7c73b2b4e1ff56268f8b5e388f63cf8064736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMBridgeMock.json b/compiled-contracts/PolygonZkEVMBridgeMock.json
index a39dd33d9..3f80587a0 100644
--- a/compiled-contracts/PolygonZkEVMBridgeMock.json
+++ b/compiled-contracts/PolygonZkEVMBridgeMock.json
@@ -867,8 +867,8 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212205357fe4be099d7eba3ac721350adeffb75403935ecb3ea1a84747cf8b5f23c3564736f6c63430008140033",
- "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212205357fe4be099d7eba3ac721350adeffb75403935ecb3ea1a84747cf8b5f23c3564736f6c63430008140033",
+ "bytecode": "0x608060405234801561000f575f80fd5b50615f348061001d5f395ff3fe608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212203eb4f60eaf973a04143dc808095d0bc352640e98fe76a4e0bfc37380215b023f64736f6c63430008140033",
+ "deployedBytecode": "0x608060405260043610620001df575f3560e01c8063715018a61162000106578063bab161bf116200009e578063dbc16976116200006a578063dbc169761462000704578063ee25560b146200071b578063f2fde38b146200074a578063fb570834146200076e575f80fd5b8063bab161bf1462000642578063be5831c7146200067b578063cd58657914620006b6578063d02103ca14620006cd575f80fd5b80638da5cb5b11620000de5780638da5cb5b146200059857806391e57e2d14620005c45780639e34070f14620005db578063aaa13cc2146200061e575f80fd5b8063715018a6146200052557806379e2cf97146200053c57806381b1c1741462000553575f80fd5b80632d2c9d94116200017a57806334ac9cf2116200015257806334ac9cf214620003ca5780633ae0504714620003f85780633e197043146200040f578063647c576c1462000501575f80fd5b80632d2c9d9414620002f95780632dfdf0b5146200031d578063318aee3d1462000343575f80fd5b8063240ff37811620001ba578063240ff37814620002765780632b5e42e7146200028d5780632c3f58cd14620002b15780632cffd02e14620002d5575f80fd5b806315064c9614620001e35780632072f6c5146200021357806322e95f2c146200022c575b5f80fd5b348015620001ef575f80fd5b50606854620001fe9060ff1681565b60405190151581526020015b60405180910390f35b3480156200021f575f80fd5b506200022a62000792565b005b34801562000238575f80fd5b50620002506200024a36600462003638565b620007f0565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016200020a565b6200022a62000287366004620036c8565b62000892565b34801562000299575f80fd5b506200022a620002ab36600462003747565b62000ab9565b348015620002bd575f80fd5b506200022a620002cf3660046200375f565b62000ac8565b348015620002e1575f80fd5b506200022a620002f336600462003794565b62000b0e565b34801562000305575f80fd5b506200022a6200031736600462003794565b62001093565b34801562000329575f80fd5b506200033460535481565b6040519081526020016200020a565b3480156200034f575f80fd5b50620003986200036136600462003872565b606b6020525f908152604090205463ffffffff811690640100000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6040805163ffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016200020a565b348015620003d6575f80fd5b50606c54620002509073ffffffffffffffffffffffffffffffffffffffff1681565b34801562000404575f80fd5b506200033462001293565b3480156200041b575f80fd5b50620003346200042d3660046200389f565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b3480156200050d575f80fd5b506200022a6200051f36600462003924565b62001378565b34801562000531575f80fd5b506200022a620015cd565b34801562000548575f80fd5b506200022a620015e2565b3480156200055f575f80fd5b50620002506200057136600462003747565b606a6020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b348015620005a4575f80fd5b50609f5473ffffffffffffffffffffffffffffffffffffffff1662000250565b348015620005d0575f80fd5b506200033460d15481565b348015620005e7575f80fd5b50620001fe620005f936600462003747565b600881901c5f90815260696020526040902054600160ff9092169190911b9081161490565b3480156200062a575f80fd5b50620002506200063c36600462003971565b6200161c565b3480156200064e575f80fd5b506068546200066590610100900463ffffffff1681565b60405163ffffffff90911681526020016200020a565b34801562000687575f80fd5b506068546200066590790100000000000000000000000000000000000000000000000000900463ffffffff1681565b6200022a620006c736600462003a1e565b62001806565b348015620006d9575f80fd5b50606854620002509065010000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b34801562000710575f80fd5b506200022a620018da565b34801562000727575f80fd5b50620003346200073936600462003747565b60696020525f908152604090205481565b34801562000756575f80fd5b506200022a6200076836600462003872565b62001936565b3480156200077a575f80fd5b50620001fe6200078c36600462003aba565b620019f3565b606c5473ffffffffffffffffffffffffffffffffffffffff163314620007e4576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee62001adb565b565b6040805160e084901b7fffffffff0000000000000000000000000000000000000000000000000000000016602080830191909152606084901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602483015282516018818403018152603890920183528151918101919091205f908152606a909152205473ffffffffffffffffffffffffffffffffffffffff165b92915050565b60685460ff1615620008d0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff868116610100909204161480620008f65750600263ffffffff861610155b156200092e576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338888348888605354604051620009849998979695949392919062003b4b565b60405180910390a162000aa162000a9b6001606860019054906101000a900463ffffffff16338989348989604051620009bf92919062003bc5565b60405180910390206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b62001b6e565b821562000ab25762000ab262001c82565b5050505050565b62000ac362001d52565b60d155565b62000ad262001d52565b6068805463ffffffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff909216919091179055565b60685460ff161562000b4c576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62000b628b8b8b8b8b8b8b8b8b8b8b5f62001dd5565b73ffffffffffffffffffffffffffffffffffffffff861662000c3a57604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff861690859060405162000bb6919062003c25565b5f6040518083038185875af1925050503d805f811462000bf2576040519150601f19603f3d011682016040523d82523d5f602084013e62000bf7565b606091505b505090508062000c33576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506200101b565b60685463ffffffff61010090910481169088160362000c7c5762000c7673ffffffffffffffffffffffffffffffffffffffff8716858562001fc0565b6200101b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f90603801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152606a90935291205490915073ffffffffffffffffffffffffffffffffffffffff168062000f92575f808062000d4e8688018862003d34565b9250925092505f8584848460405162000d6790620035f4565b62000d759392919062003df0565b8190604051809103905ff590508015801562000d93573d5f803e3d5ffd5b506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152602482018c9052919250908216906340c10f19906044015f604051808303815f87803b15801562000e06575f80fd5b505af115801562000e19573d5f803e3d5ffd5b5050505080606a5f8881526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052808e63ffffffff1681526020018d73ffffffffffffffffffffffffffffffffffffffff16815250606b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398d8d838b8b60405162000f8095949392919062003e2c565b60405180910390a15050505062001018565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801562001000575f80fd5b505af115801562001013573d5f803e3d5ffd5b505050505b50505b6040805163ffffffff8c811682528916602082015273ffffffffffffffffffffffffffffffffffffffff88811682840152861660608201526080810185905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a15050505050505050505050565b60685460ff1615620010d1576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620010e88b8b8b8b8b8b8b8b8b8b8b600162001dd5565b5f8473ffffffffffffffffffffffffffffffffffffffff1684888a86866040516024016200111a949392919062003e73565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f1806b5f200000000000000000000000000000000000000000000000000000000179052516200119d919062003c25565b5f6040518083038185875af1925050503d805f8114620011d9576040519150601f19603f3d011682016040523d82523d5f602084013e620011de565b606091505b50509050806200121a576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805163ffffffff8d811682528a16602082015273ffffffffffffffffffffffffffffffffffffffff89811682840152871660608201526080810186905290517f25308c93ceeed162da955b3f7ce3e3f93606579e40fb92029faa9efe275459839181900360a00190a1505050505050505050505050565b6053545f90819081805b60208110156200136f578083901c600116600103620013005760338160208110620012cc57620012cc62003eba565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506200132d565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080620013669062003f14565b9150506200129d565b50919392505050565b5f54610100900460ff16158080156200139757505f54600160ff909116105b80620013b25750303b158015620013b257505f5460ff166001145b62001444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015620014a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8716027fffffffffffffff0000000000000000000000000000000000000000ffffffffff16176501000000000073ffffffffffffffffffffffffffffffffffffffff8681169190910291909117909155606c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790556703782dace9d9000060d1556200156462002096565b8015620015c7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b620015d762001d52565b620007ee5f62002134565b605354606854790100000000000000000000000000000000000000000000000000900463ffffffff161015620007ee57620007ee62001c82565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b1660208201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180602001620016b090620035f4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f909101166040819052620016fb908d908d908d908d908d9060200162003f4e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262001739929160200162003f8e565b60405160208183030381529060405280519060200120604051602001620017c294939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101209a9950505050505050505050565b60d154341115620018c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f506f6c79676f6e5a6b45564d4272696467653a3a62726964676541737365743a60448201527f2043616e6e6f7420627269646765206d6f7265207468616e206d61784574686560648201527f7242726964676500000000000000000000000000000000000000000000000000608482015260a4016200143b565b620018d187878787878787620021aa565b50505050505050565b606c5473ffffffffffffffffffffffffffffffffffffffff1633146200192c576040517fe2e8106b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620007ee620026f3565b6200194062001d52565b73ffffffffffffffffffffffffffffffffffffffff8116620019e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016200143b565b620019f08162002134565b50565b5f84815b602081101562001acd57600163ffffffff8616821c8116900362001a695785816020811062001a2a5762001a2a62003eba565b60200201358260405160200162001a4b929190918252602082015260400190565b60405160208183030381529060405280519060200120915062001ab8565b8186826020811062001a7f5762001a7f62003eba565b602002013560405160200162001a9f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8062001ac48162003f14565b915050620019f7565b50821490505b949350505050565b60685460ff161562001b19576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b80600162001b7f60206002620040f7565b62001b8b919062004104565b6053541062001bc6576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f815462001bd79062003f14565b918290555090505f5b602081101562001c72578082901c60011660010362001c1857826033826020811062001c105762001c1062003eba565b015550505050565b6033816020811062001c2e5762001c2e62003eba565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808062001c699062003f14565b91505062001be0565b5062001c7d6200411a565b505050565b6053546068805463ffffffff909216790100000000000000000000000000000000000000000000000000027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff909216919091179081905573ffffffffffffffffffffffffffffffffffffffff65010000000000909104166333d6247d62001d0862001293565b6040518263ffffffff1660e01b815260040162001d2791815260200190565b5f604051808303815f87803b15801562001d3f575f80fd5b505af1158015620015c7573d5f803e3d5ffd5b609f5473ffffffffffffffffffffffffffffffffffffffff163314620007ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200143b565b62001de68b63ffffffff1662002782565b6068546040805160208082018e90528183018d9052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f9165010000000000900473ffffffffffffffffffffffffffffffffffffffff169063257b3632906084016020604051808303815f875af115801562001e85573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062001eab919062004147565b9050805f0362001ee6576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60685463ffffffff888116610100909204161462001f30576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068545f90610100900463ffffffff1662001f4d57508962001f50565b508a5b62001f7962001f70848c8c8c8c8c8c8c604051620009bf92919062003bc5565b8f8f84620019f3565b62001fb0576040517fe0417cec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905262001c7d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152620027e6565b5f54610100900460ff166200212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016200143b565b620007ee335b609f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60685460ff1615620021e8576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620021f2620028f8565b60685463ffffffff888116610100909204161480620022185750600263ffffffff881610155b1562002250576040517f0595ea2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8060608773ffffffffffffffffffffffffffffffffffffffff8816620022b457883414620022ab576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f9250620025a1565b3415620022ed576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606b602090815260409182902082518084019093525463ffffffff8116835264010000000090049092169181018290529015620023d6576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018b905273ffffffffffffffffffffffffffffffffffffffff8a1690639dc29fac906044015f604051808303815f87803b158015620023ac575f80fd5b505af1158015620023bf573d5f803e3d5ffd5b5050505080602001519450805f015193506200259f565b8515620023eb57620023eb898b89896200296d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa15801562002456573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200247c919062004147565b9050620024a273ffffffffffffffffffffffffffffffffffffffff8b1633308e62002e80565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa1580156200250d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062002533919062004147565b905062002541828262004104565b6068548c9850610100900463ffffffff1696509350620025618762002ee0565b6200256c8c62002ff4565b620025778d620030fd565b6040516020016200258b9392919062003df0565b604051602081830303815290604052945050505b505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051620025e29897969594939291906200415f565b60405180910390a1620026d462000a9b5f85878f8f8789805190602001206040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201527fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660218401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b8615620026e557620026e562001c82565b50505050620018d160018055565b60685460ff1662002730576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b600881901c5f8181526069602052604081208054600160ff861690811b9182189283905592909190818316900362000ab2576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62002849826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16620031f59092919063ffffffff16565b80519091501562001c7d57808060200190518101906200286a9190620041d7565b62001c7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016200143b565b60026001540362002966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016200143b565b6002600155565b5f6200297d6004828486620041f5565b62002988916200421e565b90507f2afa5331000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160162002c02575f808080808080620029ea896004818d620041f5565b810190620029f9919062004267565b96509650965096509650965096503373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161462002a6d576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616301462002abd576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8a851462002af7576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169162002bb2919062003c25565b5f604051808303815f865af19150503d805f811462002bed576040519150601f19603f3d011682016040523d82523d5f602084013e62002bf2565b606091505b5050505050505050505062000ab2565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f8fcbaf0c000000000000000000000000000000000000000000000000000000001462002c7e576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080808080808062002c958a6004818e620041f5565b81019062002ca49190620042bd565b975097509750975097509750975097503373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161462002d1a576040517f912ecce700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8716301462002d6a576040517f750643af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8fcbaf0c000000000000000000000000000000000000000000000000000000001790529151918f169162002e2e919062003c25565b5f604051808303815f865af19150503d805f811462002e69576040519150601f19603f3d011682016040523d82523d5f602084013e62002e6e565b606091505b50505050505050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052620015c79085907f23b872dd000000000000000000000000000000000000000000000000000000009060840162002013565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162002f63919062003c25565b5f60405180830381855afa9150503d805f811462002f9d576040519150601f19603f3d011682016040523d82523d5f602084013e62002fa2565b606091505b50915091508162002fe9576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525062001ad3565b62001ad38162003205565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f91829173ffffffffffffffffffffffffffffffffffffffff86169162003077919062003c25565b5f60405180830381855afa9150503d805f8114620030b1576040519150601f19603f3d011682016040523d82523d5f602084013e620030b6565b606091505b50915091508162002fe9576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525062001ad3565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f918291829173ffffffffffffffffffffffffffffffffffffffff8616916200317f919062003c25565b5f60405180830381855afa9150503d805f8114620031b9576040519150601f19603f3d011682016040523d82523d5f602084013e620031be565b606091505b5091509150818015620031d2575080516020145b620031df57601262001ad3565b8080602001905181019062001ad3919062004344565b606062001ad384845f85620033f0565b606060408251106200322757818060200190518101906200088c919062004362565b8151602003620033b2575f5b6020811080156200327e575082818151811062003254576200325462003eba565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15620032995780620032908162003f14565b91505062003233565b805f03620032dc57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115620032f957620032f962003bd4565b6040519080825280601f01601f19166020018201604052801562003324576020820181803683370190505b5090505f5b82811015620033aa5784818151811062003347576200334762003eba565b602001015160f81c60f81b82828151811062003367576200336762003eba565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080620033a18162003f14565b91505062003329565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b60608247101562003484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016200143b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051620034ae919062003c25565b5f6040518083038185875af1925050503d805f8114620034ea576040519150601f19603f3d011682016040523d82523d5f602084013e620034ef565b606091505b509150915062003502878383876200350d565b979650505050505050565b60608315620035a75782515f036200359f5773ffffffffffffffffffffffffffffffffffffffff85163b6200359f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200143b565b508162001ad3565b62001ad38383815115620035be5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200143b9190620043dd565b611b0d80620043f283390190565b803563ffffffff81168114620033eb575f80fd5b73ffffffffffffffffffffffffffffffffffffffff81168114620019f0575f80fd5b5f80604083850312156200364a575f80fd5b620036558362003602565b91506020830135620036678162003616565b809150509250929050565b8015158114620019f0575f80fd5b5f8083601f84011262003691575f80fd5b50813567ffffffffffffffff811115620036a9575f80fd5b602083019150836020828501011115620036c1575f80fd5b9250929050565b5f805f805f60808688031215620036dd575f80fd5b620036e88662003602565b94506020860135620036fa8162003616565b935060408601356200370c8162003672565b9250606086013567ffffffffffffffff81111562003728575f80fd5b620037368882890162003680565b969995985093965092949392505050565b5f6020828403121562003758575f80fd5b5035919050565b5f6020828403121562003770575f80fd5b6200377b8262003602565b9392505050565b8061040081018310156200088c575f80fd5b5f805f805f805f805f805f6105208c8e031215620037b0575f80fd5b620037bc8d8d62003782565b9a50620037cd6104008d0162003602565b99506104208c013598506104408c01359750620037ee6104608d0162003602565b96506104808c0135620038018162003616565b9550620038126104a08d0162003602565b94506104c08c0135620038258162003616565b93506104e08c013592506105008c013567ffffffffffffffff8111156200384a575f80fd5b620038588e828f0162003680565b915080935050809150509295989b509295989b9093969950565b5f6020828403121562003883575f80fd5b81356200377b8162003616565b60ff81168114620019f0575f80fd5b5f805f805f805f60e0888a031215620038b6575f80fd5b8735620038c38162003890565b9650620038d36020890162003602565b95506040880135620038e58162003616565b9450620038f56060890162003602565b93506080880135620039078162003616565b9699959850939692959460a0840135945060c09093013592915050565b5f805f6060848603121562003937575f80fd5b620039428462003602565b92506020840135620039548162003616565b91506040840135620039668162003616565b809150509250925092565b5f805f805f805f60a0888a03121562003988575f80fd5b620039938862003602565b96506020880135620039a58162003616565b9550604088013567ffffffffffffffff80821115620039c2575f80fd5b620039d08b838c0162003680565b909750955060608a0135915080821115620039e9575f80fd5b50620039f88a828b0162003680565b909450925050608088013562003a0e8162003890565b8091505092959891949750929550565b5f805f805f805f60c0888a03121562003a35575f80fd5b62003a408862003602565b9650602088013562003a528162003616565b955060408801359450606088013562003a6b8162003616565b9350608088013562003a7d8162003672565b925060a088013567ffffffffffffffff81111562003a99575f80fd5b62003aa78a828b0162003680565b989b979a50959850939692959293505050565b5f805f80610460858703121562003acf575f80fd5b8435935062003ae2866020870162003782565b925062003af3610420860162003602565b939692955092936104400135925050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f61010060ff8c16835263ffffffff808c16602085015273ffffffffffffffffffffffffffffffffffffffff808c166040860152818b166060860152808a166080860152508760a08501528160c085015262003bab828501878962003b04565b925080851660e085015250509a9950505050505050505050565b818382375f9101908152919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f5b8381101562003c1d57818101518382015260200162003c03565b50505f910152565b5f825162003c3881846020870162003c01565b9190910192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003c8c5762003c8c62003bd4565b604052919050565b5f67ffffffffffffffff82111562003cb05762003cb062003bd4565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011262003cec575f80fd5b813562003d0362003cfd8262003c94565b62003c42565b81815284602083860101111562003d18575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f6060848603121562003d47575f80fd5b833567ffffffffffffffff8082111562003d5f575f80fd5b62003d6d8783880162003cdc565b9450602086013591508082111562003d83575f80fd5b5062003d928682870162003cdc565b9250506040840135620039668162003890565b5f815180845262003dbe81602086016020860162003c01565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606081525f62003e04606083018662003da5565b828103602084015262003e18818662003da5565b91505060ff83166040830152949350505050565b63ffffffff861681525f73ffffffffffffffffffffffffffffffffffffffff8087166020840152808616604084015250608060608301526200350260808301848662003b04565b73ffffffffffffffffffffffffffffffffffffffff8516815263ffffffff84166020820152606060408201525f62003eb060608301848662003b04565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362003f475762003f4762003ee7565b5060010190565b606081525f62003f6360608301878962003b04565b828103602084015262003f7881868862003b04565b91505060ff831660408301529695505050505050565b5f835162003fa181846020880162003c01565b83519083019062003fb781836020880162003c01565b01949350505050565b600181815b808511156200401f57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111562004003576200400362003ee7565b808516156200401157918102915b93841c939080029062003fc5565b509250929050565b5f8262004037575060016200088c565b816200404557505f6200088c565b81600181146200405e5760028114620040695762004089565b60019150506200088c565b60ff8411156200407d576200407d62003ee7565b50506001821b6200088c565b5060208310610133831016604e8410600b8410161715620040ae575081810a6200088c565b620040ba838362003fc0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115620040ef57620040ef62003ee7565b029392505050565b5f6200377b838362004027565b818103818111156200088c576200088c62003ee7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b5f6020828403121562004158575f80fd5b5051919050565b5f61010060ff8b16835263ffffffff808b16602085015273ffffffffffffffffffffffffffffffffffffffff808b166040860152818a1660608601528089166080860152508660a08501528160c0850152620041be8285018762003da5565b925080851660e085015250509998505050505050505050565b5f60208284031215620041e8575f80fd5b81516200377b8162003672565b5f808585111562004204575f80fd5b8386111562004211575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156200425f5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156200427e575f80fd5b87356200428b8162003616565b965060208801356200429d8162003616565b955060408801359450606088013593506080880135620039078162003890565b5f805f805f805f80610100898b031215620042d6575f80fd5b8835620042e38162003616565b97506020890135620042f58162003616565b965060408901359550606089013594506080890135620043158162003672565b935060a0890135620043278162003890565b979a969950949793969295929450505060c08201359160e0013590565b5f6020828403121562004355575f80fd5b81516200377b8162003890565b5f6020828403121562004373575f80fd5b815167ffffffffffffffff8111156200438a575f80fd5b8201601f810184136200439b575f80fd5b8051620043ac62003cfd8262003c94565b818152856020838501011115620043c1575f80fd5b620043d482602083016020860162003c01565b95945050505050565b602081525f6200377b602083018462003da556fe61010060405234801562000011575f80fd5b5060405162001b0d38038062001b0d833981016040819052620000349162000282565b828260036200004483826200038d565b5060046200005382826200038d565b50503360c0525060ff811660e05246608081905262000072906200007f565b60a0525062000455915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ab6200012c565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013d9062000301565b80601f01602080910402602001604051908101604052809291908181526020018280546200016b9062000301565b8015620001ba5780601f106200019057610100808354040283529160200191620001ba565b820191905f5260205f20905b8154815290600101906020018083116200019c57829003601f168201915b5050505050905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001e8575f80fd5b81516001600160401b0380821115620002055762000205620001c4565b604051601f8301601f19908116603f01168101908282118183101715620002305762000230620001c4565b816040528381526020925086838588010111156200024c575f80fd5b5f91505b838210156200026f578582018301518183018401529082019062000250565b5f93810190920192909252949350505050565b5f805f6060848603121562000295575f80fd5b83516001600160401b0380821115620002ac575f80fd5b620002ba87838801620001d8565b94506020860151915080821115620002d0575f80fd5b50620002df86828701620001d8565b925050604084015160ff81168114620002f6575f80fd5b809150509250925092565b600181811c908216806200031657607f821691505b6020821081036200033557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000388575f81815260208120601f850160051c81016020861015620003635750805b601f850160051c820191505b8181101562000384578281556001016200036f565b5050505b505050565b81516001600160401b03811115620003a957620003a9620001c4565b620003c181620003ba845462000301565b846200033b565b602080601f831160018114620003f7575f8415620003df5750858301515b5f19600386901b1c1916600185901b17855562000384565b5f85815260208120601f198616915b82811015620004275788860151825594840194600190910190840162000406565b50858210156200044557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161166f6200049e5f395f61022d01525f81816102fb015281816105ad015261069401525f61052801525f818161036d01526104f2015261166f5ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d2578063a457c2d711610088578063d505accf11610063578063d505accf1461038f578063dd62ed3e146103a2578063ffa1ad74146103e7575f80fd5b8063a457c2d714610342578063a9059cbb14610355578063cd0d009614610368575f80fd5b806395d89b41116100b857806395d89b41146102db5780639dc29fac146102e3578063a3c573eb146102f6575f80fd5b806370a08231146102875780637ecebe00146102bc575f80fd5b806330adf81f116101275780633644e5151161010d5780633644e51514610257578063395093511461025f57806340c10f1914610272575f80fd5b806330adf81f146101ff578063313ce56714610226575f80fd5b806318160ddd1161015757806318160ddd146101b357806320606b70146101c557806323b872dd146101ec575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a610423565b60405161018791906113c1565b60405180910390f35b6101a361019e366004611452565b6104b3565b6040519015158152602001610187565b6002545b604051908152602001610187565b6101b77f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101a36101fa36600461147a565b6104cc565b6101b77f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610187565b6101b76104ef565b6101a361026d366004611452565b61054a565b610285610280366004611452565b610595565b005b6101b76102953660046114b3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6101b76102ca3660046114b3565b60056020525f908152604090205481565b61017a61066d565b6102856102f1366004611452565b61067c565b61031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6101a3610350366004611452565b61074b565b6101a3610363366004611452565b61081b565b6101b77f000000000000000000000000000000000000000000000000000000000000000081565b61028561039d3660046114d3565b610828565b6101b76103b0366004611540565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b61017a6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043290611571565b80601f016020809104026020016040519081016040528092919081815260200182805461045e90611571565b80156104a95780601f10610480576101008083540402835291602001916104a9565b820191905f5260205f20905b81548152906001019060200180831161048c57829003601f168201915b5050505050905090565b5f336104c0818585610b59565b60019150505b92915050565b5f336104d9858285610d0c565b6104e4858585610de2565b506001949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610525576105204661104f565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104c090829086906105909087906115ef565b610b59565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461065f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b6106698282611116565b5050565b60606004805461043290611571565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610741576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610656565b6106698282611207565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561080e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610656565b6104e48286868403610b59565b5f336104c0818585610de2565b834211156108b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff87165f90815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a91908661091083611602565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61097a6104ef565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f80855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a3b573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ab657508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610656565b610b4d8a8a8a610b59565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ddc5781811015610dcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610656565b610ddc8484848403610b59565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8216610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526020819052604090205481811015610fdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff8481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610ddc565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611079610423565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff8216611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610656565b8060025f8282546111a491906115ef565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff82165f908152602081905260409020548181101561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610656565b73ffffffffffffffffffffffffffffffffffffffff83165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cff565b5f6020808352835180828501525f5b818110156113ec578581018301518582016040015282016113d0565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461144d575f80fd5b919050565b5f8060408385031215611463575f80fd5b61146c8361142a565b946020939093013593505050565b5f805f6060848603121561148c575f80fd5b6114958461142a565b92506114a36020850161142a565b9150604084013590509250925092565b5f602082840312156114c3575f80fd5b6114cc8261142a565b9392505050565b5f805f805f805f60e0888a0312156114e9575f80fd5b6114f28861142a565b96506115006020890161142a565b95506040880135945060608801359350608088013560ff81168114611523575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611551575f80fd5b61155a8361142a565b91506115686020840161142a565b90509250929050565b600181811c9082168061158557607f821691505b6020821081036115bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156104c6576104c66115c2565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611632576116326115c2565b506001019056fea2646970667358221220a04a4613834006222ac539b942dfe3284c1163f5082f3bafb302007d825cd7ff64736f6c63430008140033a26469706673582212203eb4f60eaf973a04143dc808095d0bc352640e98fe76a4e0bfc37380215b023f64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMBridgeV2.json b/compiled-contracts/PolygonZkEVMBridgeV2.json
index 0fac2b1db..bfb88f28b 100644
--- a/compiled-contracts/PolygonZkEVMBridgeV2.json
+++ b/compiled-contracts/PolygonZkEVMBridgeV2.json
@@ -1006,8 +1006,8 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000e0565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000de575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61591b80620000ee5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033",
- "deployedBytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033",
+ "bytecode": "0x608060405234801562000010575f80fd5b506200001b62000021565b620000e0565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161015620000de575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6157d180620000ee5f395ff3fe6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612e6f565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004612ef6565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190612fb8565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb366004612fd1565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004612ffa565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc366004613074565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f3660046130ba565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a36104573660046130e2565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b506102426104953660046131e3565b610aa8565b3480156104a5575f80fd5b506102216104b4366004613279565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b50610281610517366004612fd1565b610c79565b348015610527575f80fd5b506101f86105363660046132f7565b610cbe565b348015610546575f80fd5b50610221610555366004613328565b610d46565b61022161056836600461340c565b611181565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161154a565b3480156105b4575f80fd5b506102a36105c33660046130ba565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613328565b61157d565b3480156105fe575f80fd5b5061022161060d36600461349c565b6117f9565b34801561061d575f80fd5b506101f861062c36600461353f565b611b14565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611b2b565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611b86565b5050505050565b606e805461076690613584565b80601f016020809104026020016040519081016040528092919081815260200182805461079290613584565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c26135bc565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610959906135e4565b915050610898565b50919392505050565b5f61098b848461097985611c50565b61098286611d3a565b61049587611e1b565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664611ee8565b60405180611ba00160405280611b668152602001613c36611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a056135bc565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a556135bc565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a97816135e4565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613c36611b669139898989604051602001610b30939291906135fc565b60408051601f1981840301815290829052610b4e9291602001613634565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54610c63906001600160a01b031685611f96565b610c71868686868686611b86565b505050505050565b6060610c8482611c50565b610c8d83611d3a565b610c9684611e1b565b604051602001610ca8939291906135fc565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610ce3575063ffffffff83166001145b15610cf5575063ffffffff8316610d1d565b610d0a64010000000063ffffffff8516613662565b610d1a9063ffffffff8616613679565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610d6a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d9a576040516302caf51760e11b815260040160405180910390fd5b610dcd8c8c8c8c8c610dc85f8e8e8e8e8e8e8e604051610dbb92919061368c565b60405180910390206107e5565b612006565b6001600160a01b038616610ecd57606f546001600160a01b0316610eb1575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e23576020820181803683370190505b50604051610e31919061369b565b5f6040518083038185875af1925050503d805f8114610e6b576040519150601f19603f3d011682016040523d82523d5f602084013e610e70565b606091505b5050905080610eab576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611117565b606f54610ec8906001600160a01b03168585612198565b611117565b606d546001600160a01b038781169116148015610efb5750606d5463ffffffff888116600160a01b90920416145b15610f12575f6001600160a01b0385168482610df9565b60685463ffffffff610100909104811690881603610f3e57610ec86001600160a01b038716858561220a565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680611109575f610fe88386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061228b92505050565b9050610ff5818888612198565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516110fb9594939291906136de565b60405180910390a150611114565b611114818787612198565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156111a557604051630bc011ff60e21b815260040160405180910390fd5b6111ad61231e565b60685463ffffffff6101009091048116908816036111de576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166112da5788341461122a576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061125790613584565b80601f016020809104026020016040519081016040528092919081815260200182805461128390613584565b80156112ce5780601f106112a5576101008083540402835291602001916112ce565b820191905f5260205f20905b8154815290600101906020018083116112b157829003601f168201915b505050505091506114c1565b3415611312576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b039081169089160361133757611332888a611f96565b6114c1565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561139757611386898b611f96565b6020810151815190955093506114b4565b85156113a9576113a9898b8989612377565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156113ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114119190613716565b90506114286001600160a01b038b1633308e612716565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561146c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114909190613716565b905061149c828261372d565b6068548c9850610100900463ffffffff169650935050505b6114bd89610c79565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611500989796959493929190613740565b60405180910390a16115266115215f85878f8f8789805190602001206107e5565b612767565b861561153457611534611ee8565b5050505061154160018055565b50505050505050565b606c546001600160a01b0316331461157557604051631736745960e31b815260040160405180910390fd5b610664612868565b60685460ff16156115a157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115d1576040516302caf51760e11b815260040160405180910390fd5b6115f38c8c8c8c8c610dc860018e8e8e8e8e8e8e604051610dbb92919061368c565b606f545f906001600160a01b03166116a657846001600160a01b031684888a868660405160240161162794939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161165c919061369b565b5f6040518083038185875af1925050503d805f8114611696576040519150601f19603f3d011682016040523d82523d5f602084013e61169b565b606091505b505080915050611757565b606f546116bd906001600160a01b03168686612198565b846001600160a01b0316878985856040516024016116de94939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611713919061369b565b5f604051808303815f865af19150503d805f811461174c576040519150601f19603f3d011682016040523d82523d5f602084013e611751565b606091505b50909150505b8061178e576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561181757505f54600160ff909116105b806118305750303b15801561183057505f5460ff166001145b6118a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff1916600117905580156118c8575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff191685831617905586166119a35763ffffffff85161561199e576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611abf565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e6119f28382613826565b50611a915f801b6012604051602001611a7d91906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b60405160208183030381529060405261228b565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611ac76128d8565b8015611541575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611b218686866109d3565b1495945050505050565b60685460ff1615611b4f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611bb7576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c0b999897969594939291906138e2565b60405180910390a1611c426115216001606860019054906101000a900463ffffffff16338a8a8a8989604051610dbb92919061368c565b8215610c7157610c71611ee8565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611caf919061369b565b5f60405180830381855afa9150503d805f8114611ce7576040519150601f19603f3d011682016040523d82523d5f602084013e611cec565b606091505b509150915081611d31576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b8161294a565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611d99919061369b565b5f60405180830381855afa9150503d805f8114611dd1576040519150601f19603f3d011682016040523d82523d5f602084013e611dd6565b606091505b509150915081611d31576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b03861691611e79919061369b565b5f60405180830381855afa9150503d805f8114611eb1576040519150601f19603f3d011682016040523d82523d5f602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261098b565b8080602001905181019061098b919061394d565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d611f4961088e565b6040518263ffffffff1660e01b8152600401611f6791815260200190565b5f604051808303815f87803b158015611f7e575f80fd5b505af1158015611f90573d5f803e3d5ffd5b50505050565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b158015611ff4575f80fd5b505af1158015610c71573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190613716565b9050805f036120f5576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806801000000000000000087161561213957869150612117848a8489611b14565b612134576040516338105f3b60e21b815260040160405180910390fd5b612183565b602087901c612149816001613968565b915087925061216461215c868c866109d3565b8a8389611b14565b612181576040516338105f3b60e21b815260040160405180910390fd5b505b61218d8282612b1a565b505050505050505050565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b1580156121f8575f80fd5b505af1158015611541573d5f803e3d5ffd5b6040516001600160a01b0383166024820152604481018290526122869084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bda565b505050565b5f8060405180611ba00160405280611b668152602001613c36611b669139836040516020016122bb929190613634565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612317576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036123705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161189e565b6002600155565b5f6123856004828486613985565b61238e916139ac565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601612568575f8080808080806123d5896004818d613985565b8101906123e291906139dc565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146124225760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301461244b5760405163750643af60e01b815260040160405180910390fd5b8a8514612484576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161251b919061369b565b5f604051808303815f865af19150503d805f8114612554576040519150601f19603f3d011682016040523d82523d5f602084013e612559565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146125b2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806125c78a6004818e613985565b8101906125d49190613a2b565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146126165760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461263f5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916126c6919061369b565b5f604051808303815f865af19150503d805f81146126ff576040519150601f19603f3d011682016040523d82523d5f602084013e612704565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f909085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161224f565b80600161277660206002613b89565b612780919061372d565b605354106127ba576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546127c9906135e4565b918290555090505f5b6020811015612859578082901c6001166001036128055782603382602081106127fd576127fd6135bc565b015550505050565b60338160208110612818576128186135bc565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612851906135e4565b9150506127d2565b50612286613b94565b60018055565b60685460ff166128a4576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff166129425760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b610664612cbe565b6060604082511061296957818060200190518101906106ca9190613ba8565b8151602003612adc575f5b6020811080156129bb5750828181518110612991576129916135bc565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156129d257806129ca816135e4565b915050612974565b805f03612a1457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612a2e57612a2e61311e565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b5090505f5b82811015612ad457848181518110612a7757612a776135bc565b602001015160f81c60f81b828281518110612a9457612a946135bc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612acc816135e4565b915050612a5d565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612b3d575063ffffffff82166001145b15612b4f575063ffffffff8216612b77565b612b6464010000000063ffffffff8416613662565b612b749063ffffffff8516613679565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611541576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612c2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d289092919063ffffffff16565b8051909150156122865780806020019051810190612c4c9190613c1a565b6122865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161189e565b5f54610100900460ff166128625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b606061098b84845f85855f80866001600160a01b03168587604051612d4d919061369b565b5f6040518083038185875af1925050503d805f8114612d87576040519150601f19603f3d011682016040523d82523d5f602084013e612d8c565b606091505b5091509150612d9d87838387612da8565b979650505050505050565b60608315612e165782515f03612e0f576001600160a01b0385163b612e0f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161189e565b508161098b565b61098b8383815115612e2b5781518083602001fd5b8060405162461bcd60e51b815260040161189e9190612fb8565b803563ffffffff81168114612b15575f80fd5b6001600160a01b0381168114612e6c575f80fd5b50565b5f8060408385031215612e80575f80fd5b612e8983612e45565b91506020830135612e9981612e58565b809150509250929050565b8015158114612e6c575f80fd5b5f8083601f840112612ec1575f80fd5b50813567ffffffffffffffff811115612ed8575f80fd5b602083019150836020828501011115612eef575f80fd5b9250929050565b5f805f805f60808688031215612f0a575f80fd5b612f1386612e45565b94506020860135612f2381612e58565b93506040860135612f3381612ea4565b9250606086013567ffffffffffffffff811115612f4e575f80fd5b612f5a88828901612eb1565b969995985093965092949392505050565b5f5b83811015612f85578181015183820152602001612f6d565b50505f910152565b5f8151808452612fa4816020860160208601612f6b565b601f01601f19169290920160200192915050565b602081525f612fca6020830184612f8d565b9392505050565b5f60208284031215612fe1575f80fd5b8135612fca81612e58565b60ff81168114612e6c575f80fd5b5f805f805f805f60e0888a031215613010575f80fd5b873561301b81612fec565b965061302960208901612e45565b9550604088013561303981612e58565b945061304760608901612e45565b9350608088013561305781612e58565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215613086575f80fd5b61308f84612e45565b9250602084013561309f81612e58565b915060408401356130af81612e58565b809150509250925092565b5f602082840312156130ca575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f61044084860312156130f5575f80fd5b8335925061310685602086016130d1565b91506131156104208501612e45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561315b5761315b61311e565b604052919050565b5f67ffffffffffffffff82111561317c5761317c61311e565b50601f01601f191660200190565b5f61319c61319784613163565b613132565b90508281528383830111156131af575f80fd5b828260208301375f602084830101529392505050565b5f82601f8301126131d4575f80fd5b612fca8383356020850161318a565b5f805f805f60a086880312156131f7575f80fd5b61320086612e45565b9450602086013561321081612e58565b9350604086013567ffffffffffffffff8082111561322c575f80fd5b61323889838a016131c5565b9450606088013591508082111561324d575f80fd5b5061325a888289016131c5565b925050608086013561326b81612fec565b809150509295509295909350565b5f805f805f8060a0878903121561328e575f80fd5b61329787612e45565b955060208701356132a781612e58565b94506040870135935060608701356132be81612ea4565b9250608087013567ffffffffffffffff8111156132d9575f80fd5b6132e589828a01612eb1565b979a9699509497509295939492505050565b5f8060408385031215613308575f80fd5b61331183612e45565b915061331f60208401612e45565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613344575f80fd5b61334e8e8e6130d1565b9b5061335e8e6104008f016130d1565b9a506108008d013599506108208d013598506108408d013597506133856108608e01612e45565b96506133956108808e0135612e58565b6108808d013595506133aa6108a08e01612e45565b94506133ba6108c08e0135612e58565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e013511156133e3575f80fd5b6133f48e6109008f01358f01612eb1565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613422575f80fd5b61342b88612e45565b9650602088013561343b81612e58565b955060408801359450606088013561345281612e58565b9350608088013561346281612ea4565b925060a088013567ffffffffffffffff81111561347d575f80fd5b6134898a828b01612eb1565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156134b1575f80fd5b6134ba87612e45565b955060208701356134ca81612e58565b94506134d860408801612e45565b935060608701356134e881612e58565b925060808701356134f881612e58565b915060a087013567ffffffffffffffff811115613513575f80fd5b8701601f81018913613523575f80fd5b6135328982356020840161318a565b9150509295509295509295565b5f805f806104608587031215613553575f80fd5b8435935061356486602087016130d1565b92506135736104208601612e45565b939692955092936104400135925050565b600181811c9082168061359857607f821691505b6020821081036135b657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016135f5576135f56135d0565b5060010190565b606081525f61360e6060830186612f8d565b82810360208401526136208186612f8d565b91505060ff83166040830152949350505050565b5f8351613645818460208801612f6b565b835190830190613659818360208801612f6b565b01949350505050565b80820281158282048414176106ca576106ca6135d0565b808201808211156106ca576106ca6135d0565b818382375f9101908152919050565b5f82516136ac818460208701612f6b565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612d9d6080830184866136b6565b5f60208284031215613726575f80fd5b5051919050565b818103818111156106ca576106ca6135d0565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015261379082850187612f8d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6137d76060830184866136b6565b9695505050505050565b601f821115612286575f81815260208120601f850160051c810160208610156138075750805b601f850160051c820191505b81811015610c7157828155600101613813565b815167ffffffffffffffff8111156138405761384061311e565b6138548161384e8454613584565b846137e1565b602080601f831160018114613887575f84156138705750858301515b5f19600386901b1c1916600185901b178555610c71565b5f85815260208120601f198616915b828110156138b557888601518255948401946001909101908401613896565b50858210156138d257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015261393382850187896136b6565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561395d575f80fd5b8151612fca81612fec565b63ffffffff818116838216019080821115612317576123176135d0565b5f8085851115613993575f80fd5b8386111561399f575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139d45780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156139f2575f80fd5b87356139fd81612e58565b96506020880135613a0d81612e58565b95506040880135945060608801359350608088013561305781612fec565b5f805f805f805f80610100898b031215613a43575f80fd5b8835613a4e81612e58565b97506020890135613a5e81612e58565b965060408901359550606089013594506080890135613a7c81612ea4565b935060a0890135613a8c81612fec565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613ae357815f1904821115613ac957613ac96135d0565b80851615613ad657918102915b93841c9390800290613aae565b509250929050565b5f82613af9575060016106ca565b81613b0557505f6106ca565b8160018114613b1b5760028114613b2557613b41565b60019150506106ca565b60ff841115613b3657613b366135d0565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613b64575081810a6106ca565b613b6e8383613aa9565b805f1904821115613b8157613b816135d0565b029392505050565b5f612fca8383613aeb565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613bb8575f80fd5b815167ffffffffffffffff811115613bce575f80fd5b8201601f81018413613bde575f80fd5b8051613bec61319782613163565b818152856020838501011115613c00575f80fd5b613c11826020830160208601612f6b565b95945050505050565b5f60208284031215613c2a575f80fd5b8151612fca81612ea456fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220a78eddd2ec1bbf392884d4e37582400b71e4492a2a59eb380e2c913c347997b764736f6c63430008140033",
+ "deployedBytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612e6f565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004612ef6565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190612fb8565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb366004612fd1565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004612ffa565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc366004613074565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f3660046130ba565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a36104573660046130e2565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b506102426104953660046131e3565b610aa8565b3480156104a5575f80fd5b506102216104b4366004613279565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b50610281610517366004612fd1565b610c79565b348015610527575f80fd5b506101f86105363660046132f7565b610cbe565b348015610546575f80fd5b50610221610555366004613328565b610d46565b61022161056836600461340c565b611181565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161154a565b3480156105b4575f80fd5b506102a36105c33660046130ba565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613328565b61157d565b3480156105fe575f80fd5b5061022161060d36600461349c565b6117f9565b34801561061d575f80fd5b506101f861062c36600461353f565b611b14565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611b2b565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611b86565b5050505050565b606e805461076690613584565b80601f016020809104026020016040519081016040528092919081815260200182805461079290613584565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c26135bc565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610959906135e4565b915050610898565b50919392505050565b5f61098b848461097985611c50565b61098286611d3a565b61049587611e1b565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664611ee8565b60405180611ba00160405280611b668152602001613c36611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a056135bc565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a556135bc565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a97816135e4565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613c36611b669139898989604051602001610b30939291906135fc565b60408051601f1981840301815290829052610b4e9291602001613634565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54610c63906001600160a01b031685611f96565b610c71868686868686611b86565b505050505050565b6060610c8482611c50565b610c8d83611d3a565b610c9684611e1b565b604051602001610ca8939291906135fc565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610ce3575063ffffffff83166001145b15610cf5575063ffffffff8316610d1d565b610d0a64010000000063ffffffff8516613662565b610d1a9063ffffffff8616613679565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610d6a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d9a576040516302caf51760e11b815260040160405180910390fd5b610dcd8c8c8c8c8c610dc85f8e8e8e8e8e8e8e604051610dbb92919061368c565b60405180910390206107e5565b612006565b6001600160a01b038616610ecd57606f546001600160a01b0316610eb1575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e23576020820181803683370190505b50604051610e31919061369b565b5f6040518083038185875af1925050503d805f8114610e6b576040519150601f19603f3d011682016040523d82523d5f602084013e610e70565b606091505b5050905080610eab576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611117565b606f54610ec8906001600160a01b03168585612198565b611117565b606d546001600160a01b038781169116148015610efb5750606d5463ffffffff888116600160a01b90920416145b15610f12575f6001600160a01b0385168482610df9565b60685463ffffffff610100909104811690881603610f3e57610ec86001600160a01b038716858561220a565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680611109575f610fe88386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061228b92505050565b9050610ff5818888612198565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516110fb9594939291906136de565b60405180910390a150611114565b611114818787612198565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156111a557604051630bc011ff60e21b815260040160405180910390fd5b6111ad61231e565b60685463ffffffff6101009091048116908816036111de576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166112da5788341461122a576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061125790613584565b80601f016020809104026020016040519081016040528092919081815260200182805461128390613584565b80156112ce5780601f106112a5576101008083540402835291602001916112ce565b820191905f5260205f20905b8154815290600101906020018083116112b157829003601f168201915b505050505091506114c1565b3415611312576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b039081169089160361133757611332888a611f96565b6114c1565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561139757611386898b611f96565b6020810151815190955093506114b4565b85156113a9576113a9898b8989612377565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156113ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114119190613716565b90506114286001600160a01b038b1633308e612716565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561146c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114909190613716565b905061149c828261372d565b6068548c9850610100900463ffffffff169650935050505b6114bd89610c79565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611500989796959493929190613740565b60405180910390a16115266115215f85878f8f8789805190602001206107e5565b612767565b861561153457611534611ee8565b5050505061154160018055565b50505050505050565b606c546001600160a01b0316331461157557604051631736745960e31b815260040160405180910390fd5b610664612868565b60685460ff16156115a157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115d1576040516302caf51760e11b815260040160405180910390fd5b6115f38c8c8c8c8c610dc860018e8e8e8e8e8e8e604051610dbb92919061368c565b606f545f906001600160a01b03166116a657846001600160a01b031684888a868660405160240161162794939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161165c919061369b565b5f6040518083038185875af1925050503d805f8114611696576040519150601f19603f3d011682016040523d82523d5f602084013e61169b565b606091505b505080915050611757565b606f546116bd906001600160a01b03168686612198565b846001600160a01b0316878985856040516024016116de94939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611713919061369b565b5f604051808303815f865af19150503d805f811461174c576040519150601f19603f3d011682016040523d82523d5f602084013e611751565b606091505b50909150505b8061178e576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561181757505f54600160ff909116105b806118305750303b15801561183057505f5460ff166001145b6118a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff1916600117905580156118c8575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff191685831617905586166119a35763ffffffff85161561199e576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611abf565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e6119f28382613826565b50611a915f801b6012604051602001611a7d91906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b60405160208183030381529060405261228b565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611ac76128d8565b8015611541575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611b218686866109d3565b1495945050505050565b60685460ff1615611b4f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611bb7576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c0b999897969594939291906138e2565b60405180910390a1611c426115216001606860019054906101000a900463ffffffff16338a8a8a8989604051610dbb92919061368c565b8215610c7157610c71611ee8565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611caf919061369b565b5f60405180830381855afa9150503d805f8114611ce7576040519150601f19603f3d011682016040523d82523d5f602084013e611cec565b606091505b509150915081611d31576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b8161294a565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611d99919061369b565b5f60405180830381855afa9150503d805f8114611dd1576040519150601f19603f3d011682016040523d82523d5f602084013e611dd6565b606091505b509150915081611d31576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b03861691611e79919061369b565b5f60405180830381855afa9150503d805f8114611eb1576040519150601f19603f3d011682016040523d82523d5f602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261098b565b8080602001905181019061098b919061394d565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d611f4961088e565b6040518263ffffffff1660e01b8152600401611f6791815260200190565b5f604051808303815f87803b158015611f7e575f80fd5b505af1158015611f90573d5f803e3d5ffd5b50505050565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b158015611ff4575f80fd5b505af1158015610c71573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190613716565b9050805f036120f5576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806801000000000000000087161561213957869150612117848a8489611b14565b612134576040516338105f3b60e21b815260040160405180910390fd5b612183565b602087901c612149816001613968565b915087925061216461215c868c866109d3565b8a8389611b14565b612181576040516338105f3b60e21b815260040160405180910390fd5b505b61218d8282612b1a565b505050505050505050565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b1580156121f8575f80fd5b505af1158015611541573d5f803e3d5ffd5b6040516001600160a01b0383166024820152604481018290526122869084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bda565b505050565b5f8060405180611ba00160405280611b668152602001613c36611b669139836040516020016122bb929190613634565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612317576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036123705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161189e565b6002600155565b5f6123856004828486613985565b61238e916139ac565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601612568575f8080808080806123d5896004818d613985565b8101906123e291906139dc565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146124225760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301461244b5760405163750643af60e01b815260040160405180910390fd5b8a8514612484576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161251b919061369b565b5f604051808303815f865af19150503d805f8114612554576040519150601f19603f3d011682016040523d82523d5f602084013e612559565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146125b2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806125c78a6004818e613985565b8101906125d49190613a2b565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146126165760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461263f5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916126c6919061369b565b5f604051808303815f865af19150503d805f81146126ff576040519150601f19603f3d011682016040523d82523d5f602084013e612704565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f909085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161224f565b80600161277660206002613b89565b612780919061372d565b605354106127ba576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546127c9906135e4565b918290555090505f5b6020811015612859578082901c6001166001036128055782603382602081106127fd576127fd6135bc565b015550505050565b60338160208110612818576128186135bc565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612851906135e4565b9150506127d2565b50612286613b94565b60018055565b60685460ff166128a4576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff166129425760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b610664612cbe565b6060604082511061296957818060200190518101906106ca9190613ba8565b8151602003612adc575f5b6020811080156129bb5750828181518110612991576129916135bc565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156129d257806129ca816135e4565b915050612974565b805f03612a1457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612a2e57612a2e61311e565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b5090505f5b82811015612ad457848181518110612a7757612a776135bc565b602001015160f81c60f81b828281518110612a9457612a946135bc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612acc816135e4565b915050612a5d565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612b3d575063ffffffff82166001145b15612b4f575063ffffffff8216612b77565b612b6464010000000063ffffffff8416613662565b612b749063ffffffff8516613679565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611541576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612c2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d289092919063ffffffff16565b8051909150156122865780806020019051810190612c4c9190613c1a565b6122865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161189e565b5f54610100900460ff166128625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b606061098b84845f85855f80866001600160a01b03168587604051612d4d919061369b565b5f6040518083038185875af1925050503d805f8114612d87576040519150601f19603f3d011682016040523d82523d5f602084013e612d8c565b606091505b5091509150612d9d87838387612da8565b979650505050505050565b60608315612e165782515f03612e0f576001600160a01b0385163b612e0f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161189e565b508161098b565b61098b8383815115612e2b5781518083602001fd5b8060405162461bcd60e51b815260040161189e9190612fb8565b803563ffffffff81168114612b15575f80fd5b6001600160a01b0381168114612e6c575f80fd5b50565b5f8060408385031215612e80575f80fd5b612e8983612e45565b91506020830135612e9981612e58565b809150509250929050565b8015158114612e6c575f80fd5b5f8083601f840112612ec1575f80fd5b50813567ffffffffffffffff811115612ed8575f80fd5b602083019150836020828501011115612eef575f80fd5b9250929050565b5f805f805f60808688031215612f0a575f80fd5b612f1386612e45565b94506020860135612f2381612e58565b93506040860135612f3381612ea4565b9250606086013567ffffffffffffffff811115612f4e575f80fd5b612f5a88828901612eb1565b969995985093965092949392505050565b5f5b83811015612f85578181015183820152602001612f6d565b50505f910152565b5f8151808452612fa4816020860160208601612f6b565b601f01601f19169290920160200192915050565b602081525f612fca6020830184612f8d565b9392505050565b5f60208284031215612fe1575f80fd5b8135612fca81612e58565b60ff81168114612e6c575f80fd5b5f805f805f805f60e0888a031215613010575f80fd5b873561301b81612fec565b965061302960208901612e45565b9550604088013561303981612e58565b945061304760608901612e45565b9350608088013561305781612e58565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215613086575f80fd5b61308f84612e45565b9250602084013561309f81612e58565b915060408401356130af81612e58565b809150509250925092565b5f602082840312156130ca575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f61044084860312156130f5575f80fd5b8335925061310685602086016130d1565b91506131156104208501612e45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561315b5761315b61311e565b604052919050565b5f67ffffffffffffffff82111561317c5761317c61311e565b50601f01601f191660200190565b5f61319c61319784613163565b613132565b90508281528383830111156131af575f80fd5b828260208301375f602084830101529392505050565b5f82601f8301126131d4575f80fd5b612fca8383356020850161318a565b5f805f805f60a086880312156131f7575f80fd5b61320086612e45565b9450602086013561321081612e58565b9350604086013567ffffffffffffffff8082111561322c575f80fd5b61323889838a016131c5565b9450606088013591508082111561324d575f80fd5b5061325a888289016131c5565b925050608086013561326b81612fec565b809150509295509295909350565b5f805f805f8060a0878903121561328e575f80fd5b61329787612e45565b955060208701356132a781612e58565b94506040870135935060608701356132be81612ea4565b9250608087013567ffffffffffffffff8111156132d9575f80fd5b6132e589828a01612eb1565b979a9699509497509295939492505050565b5f8060408385031215613308575f80fd5b61331183612e45565b915061331f60208401612e45565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613344575f80fd5b61334e8e8e6130d1565b9b5061335e8e6104008f016130d1565b9a506108008d013599506108208d013598506108408d013597506133856108608e01612e45565b96506133956108808e0135612e58565b6108808d013595506133aa6108a08e01612e45565b94506133ba6108c08e0135612e58565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e013511156133e3575f80fd5b6133f48e6109008f01358f01612eb1565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613422575f80fd5b61342b88612e45565b9650602088013561343b81612e58565b955060408801359450606088013561345281612e58565b9350608088013561346281612ea4565b925060a088013567ffffffffffffffff81111561347d575f80fd5b6134898a828b01612eb1565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156134b1575f80fd5b6134ba87612e45565b955060208701356134ca81612e58565b94506134d860408801612e45565b935060608701356134e881612e58565b925060808701356134f881612e58565b915060a087013567ffffffffffffffff811115613513575f80fd5b8701601f81018913613523575f80fd5b6135328982356020840161318a565b9150509295509295509295565b5f805f806104608587031215613553575f80fd5b8435935061356486602087016130d1565b92506135736104208601612e45565b939692955092936104400135925050565b600181811c9082168061359857607f821691505b6020821081036135b657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016135f5576135f56135d0565b5060010190565b606081525f61360e6060830186612f8d565b82810360208401526136208186612f8d565b91505060ff83166040830152949350505050565b5f8351613645818460208801612f6b565b835190830190613659818360208801612f6b565b01949350505050565b80820281158282048414176106ca576106ca6135d0565b808201808211156106ca576106ca6135d0565b818382375f9101908152919050565b5f82516136ac818460208701612f6b565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612d9d6080830184866136b6565b5f60208284031215613726575f80fd5b5051919050565b818103818111156106ca576106ca6135d0565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015261379082850187612f8d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6137d76060830184866136b6565b9695505050505050565b601f821115612286575f81815260208120601f850160051c810160208610156138075750805b601f850160051c820191505b81811015610c7157828155600101613813565b815167ffffffffffffffff8111156138405761384061311e565b6138548161384e8454613584565b846137e1565b602080601f831160018114613887575f84156138705750858301515b5f19600386901b1c1916600185901b178555610c71565b5f85815260208120601f198616915b828110156138b557888601518255948401946001909101908401613896565b50858210156138d257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015261393382850187896136b6565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561395d575f80fd5b8151612fca81612fec565b63ffffffff818116838216019080821115612317576123176135d0565b5f8085851115613993575f80fd5b8386111561399f575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139d45780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156139f2575f80fd5b87356139fd81612e58565b96506020880135613a0d81612e58565b95506040880135945060608801359350608088013561305781612fec565b5f805f805f805f80610100898b031215613a43575f80fd5b8835613a4e81612e58565b97506020890135613a5e81612e58565b965060408901359550606089013594506080890135613a7c81612ea4565b935060a0890135613a8c81612fec565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613ae357815f1904821115613ac957613ac96135d0565b80851615613ad657918102915b93841c9390800290613aae565b509250929050565b5f82613af9575060016106ca565b81613b0557505f6106ca565b8160018114613b1b5760028114613b2557613b41565b60019150506106ca565b60ff841115613b3657613b366135d0565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613b64575081810a6106ca565b613b6e8383613aa9565b805f1904821115613b8157613b816135d0565b029392505050565b5f612fca8383613aeb565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613bb8575f80fd5b815167ffffffffffffffff811115613bce575f80fd5b8201601f81018413613bde575f80fd5b8051613bec61319782613163565b818152856020838501011115613c00575f80fd5b613c11826020830160208601612f6b565b95945050505050565b5f60208284031215613c2a575f80fd5b8151612fca81612ea456fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220a78eddd2ec1bbf392884d4e37582400b71e4492a2a59eb380e2c913c347997b764736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMEtrog.json b/compiled-contracts/PolygonZkEVMEtrog.json
index 55c1adc96..e9a81ec7f 100644
--- a/compiled-contracts/PolygonZkEVMEtrog.json
+++ b/compiled-contracts/PolygonZkEVMEtrog.json
@@ -44,6 +44,11 @@
"name": "ExceedMaxVerifyBatches",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalAccInputHashDoesNotMatch",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalNumBatchBelowLastVerifiedBatch",
@@ -159,6 +164,11 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MaxTimestampSequenceInvalid",
@@ -366,6 +376,25 @@
"name": "Initialized",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RollbackBatches",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -978,6 +1007,24 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "rollbackBatches",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
"name": "rollupManager",
@@ -1020,15 +1067,20 @@
"name": "batches",
"type": "tuple[]"
},
+ {
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
+ },
{
"internalType": "uint64",
"name": "maxSequenceTimestamp",
"type": "uint64"
},
{
- "internalType": "uint64",
- "name": "initSequencedBatch",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "expectedFinalAccInputHash",
+ "type": "bytes32"
},
{
"internalType": "address",
@@ -1168,8 +1220,8 @@
"type": "function"
}
],
- "bytecode": "0x61010060405234801562000011575f80fd5b506040516200433b3803806200433b83398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e051614184620001b75f395f81816104f10152818161095501528181610ac101528181610d090152818161108b015281816115260152818161197501528181611a6a01528181612639015281816126b2015281816126d4015281816127e9015281816129890152612a4e01525f818161064a01528181611c3401528181611d3c0152818161218701528181612e3c0152612f1101525f818161070601528181610f02015281816122030152612b9601525f818161074b01528181610808015281816119be015281816127800152612b6b01526141845ff3fe608060405234801561000f575f80fd5b50600436106102d7575f3560e01c80637125702211610187578063c7fffd4b116100dd578063def57e5411610093578063eaeb077b1161006e578063eaeb077b14610781578063f35dda4714610794578063f851a4401461079c575f80fd5b8063def57e5414610733578063e46761c414610746578063e7a7ed021461076d575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff14610728575f80fd5b8063c7fffd4b146106c6578063c89e42df146106ce575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e575f80fd5b80639f26f84014610632578063a3c573eb14610645578063a652f26c1461066c575f80fd5b80638c3d73011161016d5780638c3d7301146105fc57806391cafe32146106045780639e00187714610617575f80fd5b806371257022146105ad5780637a5460c5146105c0575f80fd5b806340b5de6c1161023c57806352bdeb6d116101f25780636b8616ce116101cd5780636b8616ce146105725780636e05d2cd146105915780636ff512cc1461059a575f80fd5b806352bdeb6d14610526578063542028d514610562578063676870d21461056a575f80fd5b8063456052671161022257806345605267146104b357806349b7b802146104ec5780634e48770614610513575f80fd5b806340b5de6c1461045357806342308fab146104ab575f80fd5b8063267822471161029157806332c2d1531161027757806332c2d153146103e15780633c351e10146103f65780633cbc795b14610416575f80fd5b8063267822471461037c5780632c111c06146103c1575f80fd5b806305835f37116102c157806305835f3714610311578063107bf28c1461035a57806311e892d414610362575f80fd5b8062d0295d146102db57806303508963146102f6575b5f80fd5b6102e36107c1565b6040519081526020015b60405180910390f35b6102fe602081565b60405161ffff90911681526020016102ed565b61034d6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ed9190613459565b61034d6108c7565b61036a60f981565b60405160ff90911681526020016102ed565b60015461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b60085461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f46103ef3660046134ab565b610953565b005b60095461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461043e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ed565b61047a7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ed565b6102e3602481565b6007546104d39068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ed565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6103f46105213660046134ea565b610a22565b61034d6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61034d610c31565b6102fe601f81565b6102e36105803660046134ea565b60066020525f908152604090205481565b6102e360055481565b6103f46105a8366004613505565b610c3e565b6103f46105bb366004613644565b610d07565b61034d6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103f46112c0565b6103f4610612366004613505565b611392565b61039c73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103f4610640366004613733565b6114aa565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b61034d61067a366004613772565b611b36565b6103f461068d366004613505565b611f14565b6102e36405ca1ab1e081565b6007546104d390700100000000000000000000000000000000900467ffffffffffffffff1681565b61036a60e481565b6103f46106dc3660046137e3565b611fdd565b60025461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6102e3635ca1ab1e81565b6103f4610741366004613815565b61206f565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d39067ffffffffffffffff1681565b6103f461078f36600461388d565b612912565b61036a601b81565b5f5461039c9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087191906138fe565b6007549091505f9061089b9067ffffffffffffffff68010000000000000000820481169116613942565b67ffffffffffffffff169050805f036108b6575f9250505090565b6108c0818361396a565b9250505090565b600480546108d4906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610900906139a2565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c2576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1591815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a78576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610abf576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c91906139f3565b610bad5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bad576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d4906139a2565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c26565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d76576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d9457505f54600160ff909116105b80610dad5750303b158015610dad57505f5460ff166001145b610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610ea485612dd9565b6009549091505f90610eee90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611b36565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8d91906138fe565b90505f808483858f610fa0600143613a12565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190613a2b565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161119a9190613a8b565b5060046111a78982613a8b565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161124793929190613ba3565b60405180910390a150505050505080156112b7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611311576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146113e8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611437576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c26565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906114e8575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561151f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613a2b565b6115bb9190613be1565b67ffffffffffffffff1611156115fd576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611638576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611674576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161169c91849168010000000000000000900416613c02565b11156116d4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561196f575f87878381811061170f5761170f613c15565b90506020028101906117219190613c42565b61172a90613c7e565b90508361173681613d04565b825180516020918201208185015160408087015160608801519151959a509295505f946117a2948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461182a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561184e600188613a12565b84036118bd5742600760109054906101000a900467ffffffffffffffff16846040015161187b9190613be1565b67ffffffffffffffff1611156118bd576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061196790613d2a565b9150506116f4565b506119e57f00000000000000000000000000000000000000000000000000000000000000008461199d6107c1565b6119a79190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061303b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611ab6908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ad2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af69190613a2b565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611b6896959493929190613d78565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611cb85760f9601f8351611bfc9190613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ca29796959493929190613df5565b6040516020818303038152906040529050611dbc565b815161ffff1015611cf5576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611d04602083613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611da99796959493929190613ed7565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611e1a573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e92576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ed79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613fb9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c26565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612033576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361203f8282613a8b565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c269190613459565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120c0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036120fb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612137576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612142602442613c02565b8467ffffffffffffffff161115612185576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121ea575f80fd5b505af11580156121fc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e91906138fe565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b858110156125ac575f8b8b838181106122cc576122cc613c15565b90506020028101906122de9190613c42565b6122e790613c7e565b8051805160209091012060408201519192509067ffffffffffffffff16156124c7578561231381613d04565b9650505f818360200151846040015185606001516040516020016123759493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146123fd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612597565b8151516201d4c01015612506576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806125a490613d2a565b9150506122b1565b5060075467ffffffffffffffff90811690841611156125f7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146126ac575f61261c8386613942565b905061263267ffffffffffffffff821683613a12565b915061266b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661199d6107c1565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6127a8337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561273b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275f91906138fe565b6127699190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613114565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128689190613a2b565b90506128748782613942565b67ffffffffffffffff168967ffffffffffffffff16146128c0576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516128fc91815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612950575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612987576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1491906139f3565b15612a4b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad991906138fe565b905082811115612b15576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b51576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b9373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613114565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c2191906138fe565b6007805491925067ffffffffffffffff909116905f612c3f83613d04565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c76929190614014565b6040519081900390208142612c8c600143613a12565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612d82576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612dd1565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612dc890849033908b908b90614023565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613036576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612e80573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ec59190810190614093565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015612f57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7b9190614105565b915091508163ffffffff165f14612ff2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613033565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261310f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613178565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131729085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161308d565b50505050565b5f6131d9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132839092919063ffffffff16565b80519091501561310f57808060200190518101906131f791906139f3565b61310f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e35565b6060611f0c84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516132b5919061413d565b5f6040518083038185875af1925050503d805f81146132ef576040519150601f19603f3d011682016040523d82523d5f602084013e6132f4565b606091505b509150915061330587838387613310565b979650505050505050565b606083156133a55782515f0361339e5773ffffffffffffffffffffffffffffffffffffffff85163b61339e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e35565b5081611f0c565b611f0c83838151156133ba5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359190613459565b5f5b838110156134085781810151838201526020016133f0565b50505f910152565b5f81518084526134278160208601602086016133ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61346b6020830184613410565b9392505050565b67ffffffffffffffff81168114613487575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613487575f80fd5b5f805f606084860312156134bd575f80fd5b83356134c881613472565b92506020840135915060408401356134df8161348a565b809150509250925092565b5f602082840312156134fa575f80fd5b813561346b81613472565b5f60208284031215613515575f80fd5b813561346b8161348a565b63ffffffff81168114613487575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a5576135a5613531565b604052919050565b5f67ffffffffffffffff8211156135c6576135c6613531565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613601575f80fd5b813561361461360f826135ad565b61355e565b818152846020838601011115613628575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613659575f80fd5b86356136648161348a565b955060208701356136748161348a565b9450604087013561368481613520565b935060608701356136948161348a565b9250608087013567ffffffffffffffff808211156136b0575f80fd5b6136bc8a838b016135f2565b935060a08901359150808211156136d1575f80fd5b506136de89828a016135f2565b9150509295509295509295565b5f8083601f8401126136fb575f80fd5b50813567ffffffffffffffff811115613712575f80fd5b6020830191508360208260051b850101111561372c575f80fd5b9250929050565b5f8060208385031215613744575f80fd5b823567ffffffffffffffff81111561375a575f80fd5b613766858286016136eb565b90969095509350505050565b5f805f8060808587031215613785575f80fd5b843561379081613520565b935060208501356137a08161348a565b925060408501356137b081613520565b9150606085013567ffffffffffffffff8111156137cb575f80fd5b6137d7878288016135f2565b91505092959194509250565b5f602082840312156137f3575f80fd5b813567ffffffffffffffff811115613809575f80fd5b611f0c848285016135f2565b5f805f805f60808688031215613829575f80fd5b853567ffffffffffffffff81111561383f575f80fd5b61384b888289016136eb565b909650945050602086013561385f81613472565b9250604086013561386f81613472565b9150606086013561387f8161348a565b809150509295509295909350565b5f805f6040848603121561389f575f80fd5b833567ffffffffffffffff808211156138b6575f80fd5b818601915086601f8301126138c9575f80fd5b8135818111156138d7575f80fd5b8760208285010111156138e8575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561390e575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561396357613963613915565b5092915050565b5f8261399d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806139b657607f821691505b6020821081036139ed577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613a03575f80fd5b8151801515811461346b575f80fd5b81810381811115613a2557613a25613915565b92915050565b5f60208284031215613a3b575f80fd5b815161346b81613472565b601f82111561310f575f81815260208120601f850160051c81016020861015613a6c5750805b601f850160051c820191505b81811015612dd157828155600101613a78565b815167ffffffffffffffff811115613aa557613aa5613531565b613ab981613ab384546139a2565b84613a46565b602080601f831160018114613b0b575f8415613ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612dd1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b5757888601518255948401946001909101908401613b38565b5085821015613b9357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613bb56060830186613410565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561396357613963613915565b80820180821115613a2557613a25613915565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c74575f80fd5b9190910192915050565b5f60808236031215613c8e575f80fd5b6040516080810167ffffffffffffffff8282108183111715613cb257613cb2613531565b816040528435915080821115613cc6575f80fd5b50613cd3368286016135f2565b825250602083013560208201526040830135613cee81613472565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613d2057613d20613915565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5a57613d5a613915565b5060010190565b8082028115828204841417613a2557613a25613915565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613dce60c0830184613410565b98975050505050505050565b61ffff81811683821601908082111561396357613963613915565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e5d816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613ea0816017840160208b016133ee565b808201915050818660f81b16601782015284519150613ec68260188301602088016133ee565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613f3f816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f82816017840160208b016133ee565b808201915050818660f01b16601782015284519150613fa88260198301602088016133ee565b016019019998505050505050505050565b5f8651613fca818460208b016133ee565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156140a3575f80fd5b815167ffffffffffffffff8111156140b9575f80fd5b8201601f810184136140c9575f80fd5b80516140d761360f826135ad565b8181528560208385010111156140eb575f80fd5b6140fc8260208301602086016133ee565b95945050505050565b5f8060408385031215614116575f80fd5b825161412181613520565b60208401519092506141328161348a565b809150509250929050565b5f8251613c748184602087016133ee56fea26469706673582212203468c0d2b0beef59c94c9f274904c9bab0f8f715c31d4a4cd5424a1664f69b2e64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102d7575f3560e01c80637125702211610187578063c7fffd4b116100dd578063def57e5411610093578063eaeb077b1161006e578063eaeb077b14610781578063f35dda4714610794578063f851a4401461079c575f80fd5b8063def57e5414610733578063e46761c414610746578063e7a7ed021461076d575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff14610728575f80fd5b8063c7fffd4b146106c6578063c89e42df146106ce575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e575f80fd5b80639f26f84014610632578063a3c573eb14610645578063a652f26c1461066c575f80fd5b80638c3d73011161016d5780638c3d7301146105fc57806391cafe32146106045780639e00187714610617575f80fd5b806371257022146105ad5780637a5460c5146105c0575f80fd5b806340b5de6c1161023c57806352bdeb6d116101f25780636b8616ce116101cd5780636b8616ce146105725780636e05d2cd146105915780636ff512cc1461059a575f80fd5b806352bdeb6d14610526578063542028d514610562578063676870d21461056a575f80fd5b8063456052671161022257806345605267146104b357806349b7b802146104ec5780634e48770614610513575f80fd5b806340b5de6c1461045357806342308fab146104ab575f80fd5b8063267822471161029157806332c2d1531161027757806332c2d153146103e15780633c351e10146103f65780633cbc795b14610416575f80fd5b8063267822471461037c5780632c111c06146103c1575f80fd5b806305835f37116102c157806305835f3714610311578063107bf28c1461035a57806311e892d414610362575f80fd5b8062d0295d146102db57806303508963146102f6575b5f80fd5b6102e36107c1565b6040519081526020015b60405180910390f35b6102fe602081565b60405161ffff90911681526020016102ed565b61034d6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ed9190613459565b61034d6108c7565b61036a60f981565b60405160ff90911681526020016102ed565b60015461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b60085461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f46103ef3660046134ab565b610953565b005b60095461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461043e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ed565b61047a7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ed565b6102e3602481565b6007546104d39068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ed565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6103f46105213660046134ea565b610a22565b61034d6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61034d610c31565b6102fe601f81565b6102e36105803660046134ea565b60066020525f908152604090205481565b6102e360055481565b6103f46105a8366004613505565b610c3e565b6103f46105bb366004613644565b610d07565b61034d6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103f46112c0565b6103f4610612366004613505565b611392565b61039c73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103f4610640366004613733565b6114aa565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b61034d61067a366004613772565b611b36565b6103f461068d366004613505565b611f14565b6102e36405ca1ab1e081565b6007546104d390700100000000000000000000000000000000900467ffffffffffffffff1681565b61036a60e481565b6103f46106dc3660046137e3565b611fdd565b60025461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6102e3635ca1ab1e81565b6103f4610741366004613815565b61206f565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d39067ffffffffffffffff1681565b6103f461078f36600461388d565b612912565b61036a601b81565b5f5461039c9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087191906138fe565b6007549091505f9061089b9067ffffffffffffffff68010000000000000000820481169116613942565b67ffffffffffffffff169050805f036108b6575f9250505090565b6108c0818361396a565b9250505090565b600480546108d4906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610900906139a2565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c2576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1591815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a78576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610abf576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c91906139f3565b610bad5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bad576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d4906139a2565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c26565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d76576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d9457505f54600160ff909116105b80610dad5750303b158015610dad57505f5460ff166001145b610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610ea485612dd9565b6009549091505f90610eee90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611b36565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8d91906138fe565b90505f808483858f610fa0600143613a12565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190613a2b565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161119a9190613a8b565b5060046111a78982613a8b565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161124793929190613ba3565b60405180910390a150505050505080156112b7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611311576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146113e8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611437576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c26565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906114e8575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561151f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613a2b565b6115bb9190613be1565b67ffffffffffffffff1611156115fd576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611638576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611674576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161169c91849168010000000000000000900416613c02565b11156116d4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561196f575f87878381811061170f5761170f613c15565b90506020028101906117219190613c42565b61172a90613c7e565b90508361173681613d04565b825180516020918201208185015160408087015160608801519151959a509295505f946117a2948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461182a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561184e600188613a12565b84036118bd5742600760109054906101000a900467ffffffffffffffff16846040015161187b9190613be1565b67ffffffffffffffff1611156118bd576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061196790613d2a565b9150506116f4565b506119e57f00000000000000000000000000000000000000000000000000000000000000008461199d6107c1565b6119a79190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061303b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611ab6908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ad2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af69190613a2b565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611b6896959493929190613d78565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611cb85760f9601f8351611bfc9190613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ca29796959493929190613df5565b6040516020818303038152906040529050611dbc565b815161ffff1015611cf5576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611d04602083613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611da99796959493929190613ed7565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611e1a573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e92576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ed79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613fb9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c26565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612033576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361203f8282613a8b565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c269190613459565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120c0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036120fb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612137576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612142602442613c02565b8467ffffffffffffffff161115612185576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121ea575f80fd5b505af11580156121fc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e91906138fe565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b858110156125ac575f8b8b838181106122cc576122cc613c15565b90506020028101906122de9190613c42565b6122e790613c7e565b8051805160209091012060408201519192509067ffffffffffffffff16156124c7578561231381613d04565b9650505f818360200151846040015185606001516040516020016123759493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146123fd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612597565b8151516201d4c01015612506576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806125a490613d2a565b9150506122b1565b5060075467ffffffffffffffff90811690841611156125f7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146126ac575f61261c8386613942565b905061263267ffffffffffffffff821683613a12565b915061266b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661199d6107c1565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6127a8337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561273b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275f91906138fe565b6127699190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613114565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128689190613a2b565b90506128748782613942565b67ffffffffffffffff168967ffffffffffffffff16146128c0576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516128fc91815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612950575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612987576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1491906139f3565b15612a4b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad991906138fe565b905082811115612b15576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b51576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b9373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613114565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c2191906138fe565b6007805491925067ffffffffffffffff909116905f612c3f83613d04565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c76929190614014565b6040519081900390208142612c8c600143613a12565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612d82576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612dd1565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612dc890849033908b908b90614023565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613036576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612e80573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ec59190810190614093565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015612f57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7b9190614105565b915091508163ffffffff165f14612ff2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613033565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261310f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613178565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131729085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161308d565b50505050565b5f6131d9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132839092919063ffffffff16565b80519091501561310f57808060200190518101906131f791906139f3565b61310f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e35565b6060611f0c84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516132b5919061413d565b5f6040518083038185875af1925050503d805f81146132ef576040519150601f19603f3d011682016040523d82523d5f602084013e6132f4565b606091505b509150915061330587838387613310565b979650505050505050565b606083156133a55782515f0361339e5773ffffffffffffffffffffffffffffffffffffffff85163b61339e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e35565b5081611f0c565b611f0c83838151156133ba5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359190613459565b5f5b838110156134085781810151838201526020016133f0565b50505f910152565b5f81518084526134278160208601602086016133ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61346b6020830184613410565b9392505050565b67ffffffffffffffff81168114613487575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613487575f80fd5b5f805f606084860312156134bd575f80fd5b83356134c881613472565b92506020840135915060408401356134df8161348a565b809150509250925092565b5f602082840312156134fa575f80fd5b813561346b81613472565b5f60208284031215613515575f80fd5b813561346b8161348a565b63ffffffff81168114613487575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a5576135a5613531565b604052919050565b5f67ffffffffffffffff8211156135c6576135c6613531565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613601575f80fd5b813561361461360f826135ad565b61355e565b818152846020838601011115613628575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613659575f80fd5b86356136648161348a565b955060208701356136748161348a565b9450604087013561368481613520565b935060608701356136948161348a565b9250608087013567ffffffffffffffff808211156136b0575f80fd5b6136bc8a838b016135f2565b935060a08901359150808211156136d1575f80fd5b506136de89828a016135f2565b9150509295509295509295565b5f8083601f8401126136fb575f80fd5b50813567ffffffffffffffff811115613712575f80fd5b6020830191508360208260051b850101111561372c575f80fd5b9250929050565b5f8060208385031215613744575f80fd5b823567ffffffffffffffff81111561375a575f80fd5b613766858286016136eb565b90969095509350505050565b5f805f8060808587031215613785575f80fd5b843561379081613520565b935060208501356137a08161348a565b925060408501356137b081613520565b9150606085013567ffffffffffffffff8111156137cb575f80fd5b6137d7878288016135f2565b91505092959194509250565b5f602082840312156137f3575f80fd5b813567ffffffffffffffff811115613809575f80fd5b611f0c848285016135f2565b5f805f805f60808688031215613829575f80fd5b853567ffffffffffffffff81111561383f575f80fd5b61384b888289016136eb565b909650945050602086013561385f81613472565b9250604086013561386f81613472565b9150606086013561387f8161348a565b809150509295509295909350565b5f805f6040848603121561389f575f80fd5b833567ffffffffffffffff808211156138b6575f80fd5b818601915086601f8301126138c9575f80fd5b8135818111156138d7575f80fd5b8760208285010111156138e8575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561390e575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561396357613963613915565b5092915050565b5f8261399d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806139b657607f821691505b6020821081036139ed577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613a03575f80fd5b8151801515811461346b575f80fd5b81810381811115613a2557613a25613915565b92915050565b5f60208284031215613a3b575f80fd5b815161346b81613472565b601f82111561310f575f81815260208120601f850160051c81016020861015613a6c5750805b601f850160051c820191505b81811015612dd157828155600101613a78565b815167ffffffffffffffff811115613aa557613aa5613531565b613ab981613ab384546139a2565b84613a46565b602080601f831160018114613b0b575f8415613ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612dd1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b5757888601518255948401946001909101908401613b38565b5085821015613b9357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613bb56060830186613410565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561396357613963613915565b80820180821115613a2557613a25613915565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c74575f80fd5b9190910192915050565b5f60808236031215613c8e575f80fd5b6040516080810167ffffffffffffffff8282108183111715613cb257613cb2613531565b816040528435915080821115613cc6575f80fd5b50613cd3368286016135f2565b825250602083013560208201526040830135613cee81613472565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613d2057613d20613915565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5a57613d5a613915565b5060010190565b8082028115828204841417613a2557613a25613915565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613dce60c0830184613410565b98975050505050505050565b61ffff81811683821601908082111561396357613963613915565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e5d816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613ea0816017840160208b016133ee565b808201915050818660f81b16601782015284519150613ec68260188301602088016133ee565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613f3f816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f82816017840160208b016133ee565b808201915050818660f01b16601782015284519150613fa88260198301602088016133ee565b016019019998505050505050505050565b5f8651613fca818460208b016133ee565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156140a3575f80fd5b815167ffffffffffffffff8111156140b9575f80fd5b8201601f810184136140c9575f80fd5b80516140d761360f826135ad565b8181528560208385010111156140eb575f80fd5b6140fc8260208301602086016133ee565b95945050505050565b5f8060408385031215614116575f80fd5b825161412181613520565b60208401519092506141328161348a565b809150509250929050565b5f8251613c748184602087016133ee56fea26469706673582212203468c0d2b0beef59c94c9f274904c9bab0f8f715c31d4a4cd5424a1664f69b2e64736f6c63430008140033",
+ "bytecode": "0x61010060405234801562000011575f80fd5b50604051620045693803806200456983398101604081905262000034916200014e565b6001600160a01b0380851660a05280841660805280831660c052811660e05283838383838383836200006562000077565b505050505050505050505050620001b3565b5f54610100900460ff1615620000e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000134575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014b575f80fd5b50565b5f805f806080858703121562000162575f80fd5b84516200016f8162000136565b6020860151909450620001828162000136565b6040860151909350620001958162000136565b6060860151909250620001a88162000136565b939692955090935050565b60805160a05160c05160e0516142cc6200029d5f395f81816104fc0152818161097301528181610adf01528181610c5e01528181610dde01528181611160015281816115fb01528181611a4a01528181611b3f015281816126d901528181612752015281816127740152818161288901528181612a9f0152612b6401525f818161066801528181611d0901528181611e11015281816121ca01528181612f52015261302701525f818161073701528181610fd7015281816122780152612cac01525f81816107690152818161082601528181611a93015281816128200152612c8101526142cc5ff3fe608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637125702211610187578063c754c7ed116100dd578063d7bc90ff11610093578063eaeb077b1161006e578063eaeb077b1461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063d7bc90ff14610759578063e46761c414610764578063e7a7ed021461078b575f80fd5b8063c89e42df116100c3578063c89e42df146106ff578063cfa8ed4714610712578063d02103ca14610732575f80fd5b8063c754c7ed146106cf578063c7fffd4b146106f7575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461069d578063b0afe154146106b0578063b910e0f9146106bc575f80fd5b80639f26f84014610650578063a3c573eb14610663578063a652f26c1461068a575f80fd5b80638c3d73011161016d5780638c3d73011461061a57806391cafe32146106225780639e00187714610635575f80fd5b806371257022146105cb5780637a5460c5146105de575f80fd5b806342308fab1161023c578063542028d5116101f25780636b8616ce116101cd5780636b8616ce146105905780636e05d2cd146105af5780636ff512cc146105b8575f80fd5b8063542028d51461056d578063669adece14610575578063676870d214610588575f80fd5b806349b7b8021161022257806349b7b802146104f75780634e4877061461051e57806352bdeb6d14610531575f80fd5b806342308fab146104b657806345605267146104be575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061356f565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046135c1565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6102ee602481565b6007546104de9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff61052c366004613600565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61058336600461361b565b610c5c565b610309601f81565b6102ee61059e366004613600565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105c6366004613645565b610d13565b6103ff6105d9366004613784565b610ddc565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611395565b6103ff610630366004613645565b611467565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff61065e366004613873565b61157f565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103586106983660046138b2565b611c0b565b6103ff6106ab366004613645565b611fe9565b6102ee6405ca1ab1e081565b6103ff6106ca366004613923565b6120b2565b6007546104de90700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff61070d3660046139a3565b612996565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104de9067ffffffffffffffff1681565b6103ff6107ad3660046139d5565b612a28565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613a46565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613a8a565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ab2565b9250505090565b600480546108f290613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613aea565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613b3b565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613aea565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d69576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610e6957505f54600160ff909116105b80610e825750303b158015610e8257505f5460ff166001145b610f13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610f7985612eef565b6009549091505f90610fc390889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611c0b565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110629190613a46565b90505f808483858f611075600143613b5a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156111bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111df9190613b73565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161126f9190613bd3565b50600461127c8982613bd3565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161131c93929190613ceb565b60405180910390a1505050505050801561138c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146113e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146114bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661150c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906115bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156115f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611662573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116869190613b73565b6116909190613d29565b67ffffffffffffffff1611156116d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361170d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161177191849168010000000000000000900416613d4a565b11156117a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611a44575f8787838181106117e4576117e4613d5d565b90506020028101906117f69190613d8a565b6117ff90613dc6565b90508361180b81613e4c565b825180516020918201208185015160408087015160608801519151959a509295505f94611877948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146118ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611923600188613b5a565b84036119925742600760109054906101000a900467ffffffffffffffff1684604001516119509190613d29565b67ffffffffffffffff161115611992576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611a3c90613e72565b9150506117c9565b50611aba7f000000000000000000000000000000000000000000000000000000000000000084611a726107df565b611a7c9190613ea9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613151565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b8b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ba7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bcb9190613b73565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611c3d96959493929190613ec0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611d8d5760f9601f8351611cd19190613f22565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611d779796959493929190613f3d565b6040516020818303038152906040529050611e91565b815161ffff1015611dca576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611dd9602083613f22565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611e7e979695949392919061401f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611eef573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611f67576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611fac9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614101565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461203f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b60025473ffffffffffffffffffffffffffffffffffffffff163314612103576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f81900361213e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561217a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612185602442613d4a565b8467ffffffffffffffff1611156121c8576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561222d575f80fd5b505af115801561223f573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa1580156122d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f79190613a46565b905080612330576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b8581101561264c575f8c8c8381811061236c5761236c613d5d565b905060200281019061237e9190613d8a565b61238790613dc6565b8051805160209091012060408201519192509067ffffffffffffffff161561256757856123b381613e4c565b9650505f818360200151846040015185606001516040516020016124159493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526006909352912054909150811461249d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612637565b8151516201d4c010156125a6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061264490613e72565b915050612351565b5060075467ffffffffffffffff9081169084161115612697576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff8481169083161461274c575f6126bc8386613a8a565b90506126d267ffffffffffffffff821683613b5a565b915061270b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611a726107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612848337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ff9190613a46565b6128099190613ea9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061322a565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156128e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129089190613b73565b9050888414612943576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668760405161297f91815260200190565b60405180910390a250505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146129ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036129f88282613bd3565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061356f565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612a66575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612a9d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2a9190613b3b565b15612b61576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bef9190613a46565b905082811115612c2b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612c67576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca973ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461322a565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d379190613a46565b6007805491925067ffffffffffffffff909116905f612d5583613e4c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612d8c92919061415c565b6040519081900390208142612da2600143613b5a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612e98576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612ee7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612ede90849033908b908b9061416b565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff82161561314c576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612f96573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612fdb91908101906141db565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613091919061424d565b915091508163ffffffff165f14613108576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613149565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132259084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261328e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132889085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a3565b50505050565b5f6132ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166133999092919063ffffffff16565b805190915015613225578080602001905181019061330d9190613b3b565b613225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f0a565b6060611fe184845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516133cb9190614285565b5f6040518083038185875af1925050503d805f8114613405576040519150601f19603f3d011682016040523d82523d5f602084013e61340a565b606091505b509150915061341b87838387613426565b979650505050505050565b606083156134bb5782515f036134b45773ffffffffffffffffffffffffffffffffffffffff85163b6134b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f0a565b5081611fe1565b611fe183838151156134d05781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a919061356f565b5f5b8381101561351e578181015183820152602001613506565b50505f910152565b5f815180845261353d816020860160208601613504565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6135816020830184613526565b9392505050565b67ffffffffffffffff8116811461359d575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461359d575f80fd5b5f805f606084860312156135d3575f80fd5b83356135de81613588565b92506020840135915060408401356135f5816135a0565b809150509250925092565b5f60208284031215613610575f80fd5b813561358181613588565b5f806040838503121561362c575f80fd5b823561363781613588565b946020939093013593505050565b5f60208284031215613655575f80fd5b8135613581816135a0565b63ffffffff8116811461359d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136e5576136e5613671565b604052919050565b5f67ffffffffffffffff82111561370657613706613671565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613741575f80fd5b813561375461374f826136ed565b61369e565b818152846020838601011115613768575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613799575f80fd5b86356137a4816135a0565b955060208701356137b4816135a0565b945060408701356137c481613660565b935060608701356137d4816135a0565b9250608087013567ffffffffffffffff808211156137f0575f80fd5b6137fc8a838b01613732565b935060a0890135915080821115613811575f80fd5b5061381e89828a01613732565b9150509295509295509295565b5f8083601f84011261383b575f80fd5b50813567ffffffffffffffff811115613852575f80fd5b6020830191508360208260051b850101111561386c575f80fd5b9250929050565b5f8060208385031215613884575f80fd5b823567ffffffffffffffff81111561389a575f80fd5b6138a68582860161382b565b90969095509350505050565b5f805f80608085870312156138c5575f80fd5b84356138d081613660565b935060208501356138e0816135a0565b925060408501356138f081613660565b9150606085013567ffffffffffffffff81111561390b575f80fd5b61391787828801613732565b91505092959194509250565b5f805f805f8060a08789031215613938575f80fd5b863567ffffffffffffffff81111561394e575f80fd5b61395a89828a0161382b565b909750955050602087013561396e81613660565b9350604087013561397e81613588565b9250606087013591506080870135613995816135a0565b809150509295509295509295565b5f602082840312156139b3575f80fd5b813567ffffffffffffffff8111156139c9575f80fd5b611fe184828501613732565b5f805f604084860312156139e7575f80fd5b833567ffffffffffffffff808211156139fe575f80fd5b818601915086601f830112613a11575f80fd5b813581811115613a1f575f80fd5b876020828501011115613a30575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215613a56575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613aab57613aab613a5d565b5092915050565b5f82613ae5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613afe57607f821691505b602082108103613b35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613b4b575f80fd5b81518015158114613581575f80fd5b81810381811115613b6d57613b6d613a5d565b92915050565b5f60208284031215613b83575f80fd5b815161358181613588565b601f821115613225575f81815260208120601f850160051c81016020861015613bb45750805b601f850160051c820191505b81811015612ee757828155600101613bc0565b815167ffffffffffffffff811115613bed57613bed613671565b613c0181613bfb8454613aea565b84613b8e565b602080601f831160018114613c53575f8415613c1d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612ee7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c9f57888601518255948401946001909101908401613c80565b5085821015613cdb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613cfd6060830186613526565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613aab57613aab613a5d565b80820180821115613b6d57613b6d613a5d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613dbc575f80fd5b9190910192915050565b5f60808236031215613dd6575f80fd5b6040516080810167ffffffffffffffff8282108183111715613dfa57613dfa613671565b816040528435915080821115613e0e575f80fd5b50613e1b36828601613732565b825250602083013560208201526040830135613e3681613588565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613e6857613e68613a5d565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ea257613ea2613a5d565b5060010190565b8082028115828204841417613b6d57613b6d613a5d565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613f1660c0830184613526565b98975050505050505050565b61ffff818116838216019080821115613aab57613aab613a5d565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613fa5816003860160208c01613504565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613fe8816017840160208b01613504565b808201915050818660f81b1660178201528451915061400e826018830160208801613504565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614087816003860160208c01613504565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140ca816017840160208b01613504565b808201915050818660f01b166017820152845191506140f0826019830160208801613504565b016019019998505050505050505050565b5f8651614112818460208b01613504565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156141eb575f80fd5b815167ffffffffffffffff811115614201575f80fd5b8201601f81018413614211575f80fd5b805161421f61374f826136ed565b818152856020838501011115614233575f80fd5b614244826020830160208601613504565b95945050505050565b5f806040838503121561425e575f80fd5b825161426981613660565b602084015190925061427a816135a0565b809150509250929050565b5f8251613dbc81846020870161350456fea26469706673582212205ddecaf86c46faffb47796695a1c8d3aa7161a8585c78896c188600c5892570464736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e2575f3560e01c80637125702211610187578063c754c7ed116100dd578063d7bc90ff11610093578063eaeb077b1161006e578063eaeb077b1461079f578063f35dda47146107b2578063f851a440146107ba575f80fd5b8063d7bc90ff14610759578063e46761c414610764578063e7a7ed021461078b575f80fd5b8063c89e42df116100c3578063c89e42df146106ff578063cfa8ed4714610712578063d02103ca14610732575f80fd5b8063c754c7ed146106cf578063c7fffd4b146106f7575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461069d578063b0afe154146106b0578063b910e0f9146106bc575f80fd5b80639f26f84014610650578063a3c573eb14610663578063a652f26c1461068a575f80fd5b80638c3d73011161016d5780638c3d73011461061a57806391cafe32146106225780639e00187714610635575f80fd5b806371257022146105cb5780637a5460c5146105de575f80fd5b806342308fab1161023c578063542028d5116101f25780636b8616ce116101cd5780636b8616ce146105905780636e05d2cd146105af5780636ff512cc146105b8575f80fd5b8063542028d51461056d578063669adece14610575578063676870d214610588575f80fd5b806349b7b8021161022257806349b7b802146104f75780634e4877061461051e57806352bdeb6d14610531575f80fd5b806342308fab146104b657806345605267146104be575f80fd5b8063267822471161029c5780633c351e10116102775780633c351e10146104015780633cbc795b1461042157806340b5de6c1461045e575f80fd5b806326782247146103875780632c111c06146103cc57806332c2d153146103ec575f80fd5b806305835f37116102cc57806305835f371461031c578063107bf28c1461036557806311e892d41461036d575f80fd5b8062d0295d146102e65780630350896314610301575b5f80fd5b6102ee6107df565b6040519081526020015b60405180910390f35b610309602081565b60405161ffff90911681526020016102f8565b6103586040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102f8919061356f565b6103586108e5565b61037560f981565b60405160ff90911681526020016102f8565b6001546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102f8565b6008546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103ff6103fa3660046135c1565b610971565b005b6009546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104499074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102f8565b6104857fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102f8565b6102ee602481565b6007546104de9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102f8565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103ff61052c366004613600565b610a40565b6103586040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610358610c4f565b6103ff61058336600461361b565b610c5c565b610309601f81565b6102ee61059e366004613600565b60066020525f908152604090205481565b6102ee60055481565b6103ff6105c6366004613645565b610d13565b6103ff6105d9366004613784565b610ddc565b6103586040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103ff611395565b6103ff610630366004613645565b611467565b6103a773a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103ff61065e366004613873565b61157f565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6103586106983660046138b2565b611c0b565b6103ff6106ab366004613645565b611fe9565b6102ee6405ca1ab1e081565b6103ff6106ca366004613923565b6120b2565b6007546104de90700100000000000000000000000000000000900467ffffffffffffffff1681565b61037560e481565b6103ff61070d3660046139a3565b612996565b6002546103a79073ffffffffffffffffffffffffffffffffffffffff1681565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6102ee635ca1ab1e81565b6103a77f000000000000000000000000000000000000000000000000000000000000000081565b6007546104de9067ffffffffffffffff1681565b6103ff6107ad3660046139d5565b612a28565b610375601b81565b5f546103a79062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190613a46565b6007549091505f906108b99067ffffffffffffffff68010000000000000000820481169116613a8a565b67ffffffffffffffff169050805f036108d4575f9250505090565b6108de8183613ab2565b9250505090565b600480546108f290613aea565b80601f016020809104026020016040519081016040528092919081815260200182805461091e90613aea565b80156109695780601f1061094057610100808354040283529160200191610969565b820191905f5260205f20905b81548152906001019060200180831161094c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109e0576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a3391815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a96576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610add576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6a9190613b3b565b610bcb5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bcb576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108f290613aea565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610ccb576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610d69576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c44565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610e4b576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610e6957505f54600160ff909116105b80610e825750303b158015610e8257505f5460ff166001145b610f13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610f7985612eef565b6009549091505f90610fc390889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611c0b565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110629190613a46565b90505f808483858f611075600143613b5a565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156111bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111df9190613b73565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161126f9190613bd3565b50600461127c8982613bd3565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161131c93929190613ceb565b60405180910390a1505050505050801561138c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146113e6576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146114bd576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1661150c576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c44565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906115bd575073ffffffffffffffffffffffffffffffffffffffff81163314155b156115f4576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611662573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116869190613b73565b6116909190613d29565b67ffffffffffffffff1611156116d2576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361170d576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611749576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161177191849168010000000000000000900416613d4a565b11156117a9576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611a44575f8787838181106117e4576117e4613d5d565b90506020028101906117f69190613d8a565b6117ff90613dc6565b90508361180b81613e4c565b825180516020918201208185015160408087015160608801519151959a509295505f94611877948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152600690935291205490915081146118ff576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611923600188613b5a565b84036119925742600760109054906101000a900467ffffffffffffffff1684604001516119509190613d29565b67ffffffffffffffff161115611992576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611a3c90613e72565b9150506117c9565b50611aba7f000000000000000000000000000000000000000000000000000000000000000084611a726107df565b611a7c9190613ea9565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613151565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611b8b908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ba7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bcb9190613b73565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611c3d96959493929190613ec0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611d8d5760f9601f8351611cd19190613f22565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611d779796959493929190613f3d565b6040516020818303038152906040529050611e91565b815161ffff1015611dca576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611dd9602083613f22565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611e7e979695949392919061401f565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611eef573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611f67576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611fac9084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001614101565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461203f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c44565b60025473ffffffffffffffffffffffffffffffffffffffff163314612103576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f81900361213e576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561217a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612185602442613d4a565b8467ffffffffffffffff1611156121c8576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561222d575f80fd5b505af115801561223f573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa1580156122d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f79190613a46565b905080612330576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b8581101561264c575f8c8c8381811061236c5761236c613d5d565b905060200281019061237e9190613d8a565b61238790613dc6565b8051805160209091012060408201519192509067ffffffffffffffff161561256757856123b381613e4c565b9650505f818360200151846040015185606001516040516020016124159493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f9081526006909352912054909150811461249d576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612637565b8151516201d4c010156125a6576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b5050808061264490613e72565b915050612351565b5060075467ffffffffffffffff9081169084161115612697576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff8481169083161461274c575f6126bc8386613a8a565b90506126d267ffffffffffffffff821683613b5a565b915061270b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611a726107df565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612848337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ff9190613a46565b6128099190613ea9565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061322a565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156128e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129089190613b73565b9050888414612943576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e7668760405161297f91815260200190565b60405180910390a250505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146129ec576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60036129f88282613bd3565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c44919061356f565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612a66575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612a9d576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b2a9190613b3b565b15612b61576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bef9190613a46565b905082811115612c2b576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612c67576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ca973ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461322a565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d379190613a46565b6007805491925067ffffffffffffffff909116905f612d5583613e4c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612d8c92919061415c565b6040519081900390208142612da2600143613b5a565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612e98576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612ee7565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612ede90849033908b908b9061416b565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff82161561314c576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612f96573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612fdb91908101906141db565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa15801561306d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613091919061424d565b915091508163ffffffff165f14613108576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613149565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526132259084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261328e565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526132889085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016131a3565b50505050565b5f6132ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166133999092919063ffffffff16565b805190915015613225578080602001905181019061330d9190613b3b565b613225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f0a565b6060611fe184845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516133cb9190614285565b5f6040518083038185875af1925050503d805f8114613405576040519150601f19603f3d011682016040523d82523d5f602084013e61340a565b606091505b509150915061341b87838387613426565b979650505050505050565b606083156134bb5782515f036134b45773ffffffffffffffffffffffffffffffffffffffff85163b6134b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f0a565b5081611fe1565b611fe183838151156134d05781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a919061356f565b5f5b8381101561351e578181015183820152602001613506565b50505f910152565b5f815180845261353d816020860160208601613504565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6135816020830184613526565b9392505050565b67ffffffffffffffff8116811461359d575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff8116811461359d575f80fd5b5f805f606084860312156135d3575f80fd5b83356135de81613588565b92506020840135915060408401356135f5816135a0565b809150509250925092565b5f60208284031215613610575f80fd5b813561358181613588565b5f806040838503121561362c575f80fd5b823561363781613588565b946020939093013593505050565b5f60208284031215613655575f80fd5b8135613581816135a0565b63ffffffff8116811461359d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156136e5576136e5613671565b604052919050565b5f67ffffffffffffffff82111561370657613706613671565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613741575f80fd5b813561375461374f826136ed565b61369e565b818152846020838601011115613768575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613799575f80fd5b86356137a4816135a0565b955060208701356137b4816135a0565b945060408701356137c481613660565b935060608701356137d4816135a0565b9250608087013567ffffffffffffffff808211156137f0575f80fd5b6137fc8a838b01613732565b935060a0890135915080821115613811575f80fd5b5061381e89828a01613732565b9150509295509295509295565b5f8083601f84011261383b575f80fd5b50813567ffffffffffffffff811115613852575f80fd5b6020830191508360208260051b850101111561386c575f80fd5b9250929050565b5f8060208385031215613884575f80fd5b823567ffffffffffffffff81111561389a575f80fd5b6138a68582860161382b565b90969095509350505050565b5f805f80608085870312156138c5575f80fd5b84356138d081613660565b935060208501356138e0816135a0565b925060408501356138f081613660565b9150606085013567ffffffffffffffff81111561390b575f80fd5b61391787828801613732565b91505092959194509250565b5f805f805f8060a08789031215613938575f80fd5b863567ffffffffffffffff81111561394e575f80fd5b61395a89828a0161382b565b909750955050602087013561396e81613660565b9350604087013561397e81613588565b9250606087013591506080870135613995816135a0565b809150509295509295509295565b5f602082840312156139b3575f80fd5b813567ffffffffffffffff8111156139c9575f80fd5b611fe184828501613732565b5f805f604084860312156139e7575f80fd5b833567ffffffffffffffff808211156139fe575f80fd5b818601915086601f830112613a11575f80fd5b813581811115613a1f575f80fd5b876020828501011115613a30575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215613a56575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613aab57613aab613a5d565b5092915050565b5f82613ae5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c90821680613afe57607f821691505b602082108103613b35577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613b4b575f80fd5b81518015158114613581575f80fd5b81810381811115613b6d57613b6d613a5d565b92915050565b5f60208284031215613b83575f80fd5b815161358181613588565b601f821115613225575f81815260208120601f850160051c81016020861015613bb45750805b601f850160051c820191505b81811015612ee757828155600101613bc0565b815167ffffffffffffffff811115613bed57613bed613671565b613c0181613bfb8454613aea565b84613b8e565b602080601f831160018114613c53575f8415613c1d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612ee7565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613c9f57888601518255948401946001909101908401613c80565b5085821015613cdb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613cfd6060830186613526565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613aab57613aab613a5d565b80820180821115613b6d57613b6d613a5d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613dbc575f80fd5b9190910192915050565b5f60808236031215613dd6575f80fd5b6040516080810167ffffffffffffffff8282108183111715613dfa57613dfa613671565b816040528435915080821115613e0e575f80fd5b50613e1b36828601613732565b825250602083013560208201526040830135613e3681613588565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613e6857613e68613a5d565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ea257613ea2613a5d565b5060010190565b8082028115828204841417613b6d57613b6d613a5d565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613f1660c0830184613526565b98975050505050505050565b61ffff818116838216019080821115613aab57613aab613a5d565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613fa5816003860160208c01613504565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613fe8816017840160208b01613504565b808201915050818660f81b1660178201528451915061400e826018830160208801613504565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751614087816003860160208c01613504565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b16600382015286516140ca816017840160208b01613504565b808201915050818660f01b166017820152845191506140f0826019830160208801613504565b016019019998505050505050505050565b5f8651614112818460208b01613504565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156141eb575f80fd5b815167ffffffffffffffff811115614201575f80fd5b8201601f81018413614211575f80fd5b805161421f61374f826136ed565b818152856020838501011115614233575f80fd5b614244826020830160208601613504565b95945050505050565b5f806040838503121561425e575f80fd5b825161426981613660565b602084015190925061427a816135a0565b809150509250929050565b5f8251613dbc81846020870161350456fea26469706673582212205ddecaf86c46faffb47796695a1c8d3aa7161a8585c78896c188600c5892570464736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMEtrogPrevious.json b/compiled-contracts/PolygonZkEVMEtrogPrevious.json
index ee0fabec8..3109847e8 100644
--- a/compiled-contracts/PolygonZkEVMEtrogPrevious.json
+++ b/compiled-contracts/PolygonZkEVMEtrogPrevious.json
@@ -44,6 +44,11 @@
"name": "ExceedMaxVerifyBatches",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalAccInputHashDoesNotMatch",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalNumBatchBelowLastVerifiedBatch",
@@ -159,6 +164,11 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MaxTimestampSequenceInvalid",
@@ -644,6 +654,19 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "TIMESTAMP_RANGE",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "acceptAdminRole",
@@ -1007,6 +1030,16 @@
"name": "batches",
"type": "tuple[]"
},
+ {
+ "internalType": "uint64",
+ "name": "maxSequenceTimestamp",
+ "type": "uint64"
+ },
+ {
+ "internalType": "uint64",
+ "name": "initSequencedBatch",
+ "type": "uint64"
+ },
{
"internalType": "address",
"name": "l2Coinbase",
@@ -1145,8 +1178,8 @@
"type": "function"
}
],
- "bytecode": "0x61010060405234801562000011575f80fd5b50604051620042443803806200424483398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e05161408d620001b75f395f81816104de0152818161094201528181610aae01528181610cf6015281816112c80152818161176301528181611bb201528181611ca701528181612323015281816123e801528181612cf201528181612d6b01528181612d8d0152612ea201525f818161063701528181610eea01528181610fbf01528181611e7101528181611f79015261283d01525f81816106f30152818161113f0152818161253001526128b901525f8181610725015281816107f501528181611bfb015281816125050152612e39015261408d5ff3fe608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613392565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e4565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613423565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613423565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343e565b610c2b565b6103e96105a836600461357d565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fd565b6103e96105ff36600461343e565b6115cf565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366c565b6116e7565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ab565b611d73565b6103e961067a36600461343e565b612151565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371c565b61221a565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374e565b6122ac565b6103e961077c3660046137bf565b612773565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613807565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384b565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613873565b9250505090565b600480546108c1906138ab565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ab565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fc565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ab565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e4576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391b565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015611005573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611029919061398d565b915091508163ffffffff165f146110a0576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e1565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d73565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190613807565b90505f808483858f6111dd6001436139c5565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611323573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134791906139de565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d79190613a3e565b5060046113e48982613a3e565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148493929190613b56565b60405180910390a150505050505080156114f4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611625576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611674576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611725575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ee91906139de565b6117f89190613b94565b67ffffffffffffffff16111561183a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611875576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118d991849168010000000000000000900416613bb5565b1115611911576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bac575f87878381811061194c5761194c613bc8565b905060200281019061195e9190613bf5565b61196790613c31565b90508361197381613cb7565b825180516020918201208185015160408087015160608801519151959a509295505f946119df948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a67576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8b6001886139c5565b8403611afa5742600760109054906101000a900467ffffffffffffffff168460400151611ab89190613b94565b67ffffffffffffffff161115611afa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba490613cdd565b915050611931565b50611c227f000000000000000000000000000000000000000000000000000000000000000084611bda6107ae565b611be49190613d14565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f74565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3391906139de565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da596959493929190613d2b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef55760f9601f8351611e399190613d8d565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611edf9796959493929190613da8565b6040516020818303038152906040529050611ff9565b815161ffff1015611f32576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f41602083613d8d565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe69796959493929190613e8a565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612057573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120cf576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121149084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612270576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227c8282613a3e565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613392565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122ea575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612321576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ae91906138fc565b156123e5576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124739190613807565b9050828111156124af576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124eb576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252d73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304d565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612597573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bb9190613807565b6007805491925067ffffffffffffffff909116905f6125d983613cb7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612610929190613fc7565b60405190819003902081426126266001436139c5565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276290849033908b908b90613fd6565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c4576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036127ff576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a0575f80fd5b505af11580156128b2573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129449190613807565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c65575f8a8a8381811061298557612985613bc8565b90506020028101906129979190613bf5565b6129a090613c31565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8057856129cc81613cb7565b9650505f81836020015184604001518560600151604051602001612a2e9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c50565b8151516201d4c01015612bbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5d90613cdd565b91505061296a565b5060075467ffffffffffffffff9081169084161115612cb0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d65575f612cd5838661384b565b9050612ceb67ffffffffffffffff8216836139c5565b9150612d247f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bda6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e61337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e189190613807565b612e229190613d14565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304d565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2191906139de565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f5f91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130489084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b1565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ab9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc6565b50505050565b5f613112826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bc9092919063ffffffff16565b805190915015613048578080602001905181019061313091906138fc565b613048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ee9190614046565b5f6040518083038185875af1925050503d805f8114613228576040519150601f19603f3d011682016040523d82523d5f602084013e61322d565b606091505b509150915061323e87838387613249565b979650505050505050565b606083156132de5782515f036132d75773ffffffffffffffffffffffffffffffffffffffff85163b6132d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b5081612149565b61214983838151156132f35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613392565b5f5b83811015613341578181015183820152602001613329565b50505f910152565b5f8151808452613360816020860160208601613327565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a46020830184613349565b9392505050565b67ffffffffffffffff811681146133c0575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c0575f80fd5b5f805f606084860312156133f6575f80fd5b8335613401816133ab565b9250602084013591506040840135613418816133c3565b809150509250925092565b5f60208284031215613433575f80fd5b81356133a4816133ab565b5f6020828403121561344e575f80fd5b81356133a4816133c3565b63ffffffff811681146133c0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134de576134de61346a565b604052919050565b5f67ffffffffffffffff8211156134ff576134ff61346a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353a575f80fd5b813561354d613548826134e6565b613497565b818152846020838601011115613561575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613592575f80fd5b863561359d816133c3565b955060208701356135ad816133c3565b945060408701356135bd81613459565b935060608701356135cd816133c3565b9250608087013567ffffffffffffffff808211156135e9575f80fd5b6135f58a838b0161352b565b935060a089013591508082111561360a575f80fd5b5061361789828a0161352b565b9150509295509295509295565b5f8083601f840112613634575f80fd5b50813567ffffffffffffffff81111561364b575f80fd5b6020830191508360208260051b8501011115613665575f80fd5b9250929050565b5f806020838503121561367d575f80fd5b823567ffffffffffffffff811115613693575f80fd5b61369f85828601613624565b90969095509350505050565b5f805f80608085870312156136be575f80fd5b84356136c981613459565b935060208501356136d9816133c3565b925060408501356136e981613459565b9150606085013567ffffffffffffffff811115613704575f80fd5b6137108782880161352b565b91505092959194509250565b5f6020828403121561372c575f80fd5b813567ffffffffffffffff811115613742575f80fd5b6121498482850161352b565b5f805f60408486031215613760575f80fd5b833567ffffffffffffffff80821115613777575f80fd5b818601915086601f83011261378a575f80fd5b813581811115613798575f80fd5b8760208285010111156137a9575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d1575f80fd5b833567ffffffffffffffff8111156137e7575f80fd5b6137f386828701613624565b9094509250506020840135613418816133c3565b5f60208284031215613817575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386c5761386c61381e565b5092915050565b5f826138a6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138bf57607f821691505b6020821081036138f6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390c575f80fd5b815180151581146133a4575f80fd5b5f6020828403121561392b575f80fd5b815167ffffffffffffffff811115613941575f80fd5b8201601f81018413613951575f80fd5b805161395f613548826134e6565b818152856020838501011115613973575f80fd5b613984826020830160208601613327565b95945050505050565b5f806040838503121561399e575f80fd5b82516139a981613459565b60208401519092506139ba816133c3565b809150509250929050565b818103818111156139d8576139d861381e565b92915050565b5f602082840312156139ee575f80fd5b81516133a4816133ab565b601f821115613048575f81815260208120601f850160051c81016020861015613a1f5750805b601f850160051c820191505b8181101561276b57828155600101613a2b565b815167ffffffffffffffff811115613a5857613a5861346a565b613a6c81613a6684546138ab565b846139f9565b602080601f831160018114613abe575f8415613a885750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276b565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0a57888601518255948401946001909101908401613aeb565b5085821015613b4657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b686060830186613349565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386c5761386c61381e565b808201808211156139d8576139d861381e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c27575f80fd5b9190910192915050565b5f60808236031215613c41575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6557613c6561346a565b816040528435915080821115613c79575f80fd5b50613c863682860161352b565b825250602083013560208201526040830135613ca1816133ab565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd357613cd361381e565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0d57613d0d61381e565b5060010190565b80820281158282048414176139d8576139d861381e565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8160c0830184613349565b98975050505050505050565b61ffff81811683821601908082111561386c5761386c61381e565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e10816003860160208c01613327565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e53816017840160208b01613327565b808201915050818660f81b16601782015284519150613e79826018830160208801613327565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef2816003860160208c01613327565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f35816017840160208b01613327565b808201915050818660f01b16601782015284519150613f5b826019830160208801613327565b016019019998505050505050505050565b5f8651613f7d818460208b01613327565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2781846020870161332756fea2646970667358221220fe6aeb71b56662d290791f6a1324488b174587bd38fc3d970c536604115c100864736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c80637a5460c51161017c578063c7fffd4b116100dd578063e46761c411610093578063ecef3f991161006e578063ecef3f991461076e578063f35dda4714610781578063f851a44014610789575f80fd5b8063e46761c414610720578063e7a7ed0214610747578063eaeb077b1461075b575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106ce578063d02103ca146106ee578063d7bc90ff14610715575f80fd5b8063c7fffd4b146106b3578063c89e42df146106bb575f80fd5b8063a3c573eb11610132578063ada8f91911610118578063ada8f9191461066c578063b0afe1541461067f578063c754c7ed1461068b575f80fd5b8063a3c573eb14610632578063a652f26c14610659575f80fd5b806391cafe321161016257806391cafe32146105f15780639e001877146106045780639f26f8401461061f575f80fd5b80637a5460c5146105ad5780638c3d7301146105e9575f80fd5b806340b5de6c11610231578063542028d5116101e75780636e05d2cd116101c25780636e05d2cd1461057e5780636ff512cc14610587578063712570221461059a575f80fd5b8063542028d51461054f578063676870d2146105575780636b8616ce1461055f575f80fd5b806349b7b8021161021757806349b7b802146104d95780634e4877061461050057806352bdeb6d14610513575f80fd5b806340b5de6c1461044857806345605267146104a0575f80fd5b8063267822471161028657806332c2d1531161026c57806332c2d153146103d65780633c351e10146103eb5780633cbc795b1461040b575f80fd5b806326782247146103715780632c111c06146103b6575f80fd5b806305835f37116102b657806305835f3714610306578063107bf28c1461034f57806311e892d414610357575f80fd5b8062d0295d146102d057806303508963146102eb575b5f80fd5b6102d86107ae565b6040519081526020015b60405180910390f35b6102f3602081565b60405161ffff90911681526020016102e2565b6103426040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102e29190613392565b6103426108b4565b61035f60f981565b60405160ff90911681526020016102e2565b6001546103919073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e2565b6008546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103e96103e43660046133e4565b610940565b005b6009546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104339074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102e2565b61046f7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102e2565b6007546104c09068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102e2565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103e961050e366004613423565b610a0f565b6103426040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610342610c1e565b6102f3601f81565b6102d861056d366004613423565b60066020525f908152604090205481565b6102d860055481565b6103e961059536600461343e565b610c2b565b6103e96105a836600461357d565b610cf4565b6103426040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103e96114fd565b6103e96105ff36600461343e565b6115cf565b61039173a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103e961062d36600461366c565b6116e7565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103426106673660046136ab565b611d73565b6103e961067a36600461343e565b612151565b6102d86405ca1ab1e081565b6007546104c090700100000000000000000000000000000000900467ffffffffffffffff1681565b61035f60e481565b6103e96106c936600461371c565b61221a565b6002546103919073ffffffffffffffffffffffffffffffffffffffff1681565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6102d8635ca1ab1e81565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6007546104c09067ffffffffffffffff1681565b6103e961076936600461374e565b6122ac565b6103e961077c3660046137bf565b612773565b61035f601b81565b5f546103919062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190613807565b6007549091505f906108889067ffffffffffffffff6801000000000000000082048116911661384b565b67ffffffffffffffff169050805f036108a3575f9250505090565b6108ad8183613873565b9250505090565b600480546108c1906138ab565b80601f01602080910402602001604051908101604052809291908181526020018280546108ed906138ab565b80156109385780601f1061090f57610100808354040283529160200191610938565b820191905f5260205f20905b81548152906001019060200180831161091b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109af576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a0291815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a65576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610aac576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3991906138fc565b610b9a5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610b9a576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108c1906138ab565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c81576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c13565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d63576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d8157505f54600160ff909116105b80610d9a5750303b158015610d9a57505f5460ff166001145b610e2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e87575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b606073ffffffffffffffffffffffffffffffffffffffff8516156110e4576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015610f2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f73919081019061391b565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015611005573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611029919061398d565b915091508163ffffffff165f146110a0576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556110e1565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555b50505b6009545f9061112b90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611d73565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190613807565b90505f808483858f6111dd6001436139c5565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611323573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134791906139de565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600390816113d79190613a3e565b5060046113e48982613a3e565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161148493929190613b56565b60405180910390a150505050505080156114f4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461154e576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611625576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611674576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c13565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611725575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561175c576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ee91906139de565b6117f89190613b94565b67ffffffffffffffff16111561183a576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611875576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156118b1576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff808216916118d991849168010000000000000000900416613bb5565b1115611911576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611bac575f87878381811061194c5761194c613bc8565b905060200281019061195e9190613bf5565b61196790613c31565b90508361197381613cb7565b825180516020918201208185015160408087015160608801519151959a509295505f946119df948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611a67576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611a8b6001886139c5565b8403611afa5742600760109054906101000a900467ffffffffffffffff168460400151611ab89190613b94565b67ffffffffffffffff161115611afa576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611ba490613cdd565b915050611931565b50611c227f000000000000000000000000000000000000000000000000000000000000000084611bda6107ae565b611be49190613d14565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190612f74565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611cf3908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611d0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3391906139de565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611da596959493929190613d2b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611ef55760f9601f8351611e399190613d8d565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611edf9796959493929190613da8565b6040516020818303038152906040529050611ff9565b815161ffff1015611f32576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611f41602083613d8d565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611fe69796959493929190613e8a565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015612057573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166120cf576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906121149084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613f6c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146121a7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c13565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612270576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361227c8282613a3e565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c139190613392565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906122ea575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612321576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ae91906138fc565b156123e5576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa15801561244f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124739190613807565b9050828111156124af576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113888411156124eb576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61252d73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633308461304d565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612597573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bb9190613807565b6007805491925067ffffffffffffffff909116905f6125d983613cb7565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612610929190613fc7565b60405190819003902081426126266001436139c5565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361271c576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a261276b565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061276290849033908b908b90613fd6565b60405180910390a25b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146127c4576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f8190036127ff576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561283b576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156128a0575f80fd5b505af11580156128b2573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129449190613807565b60075460055491925042916801000000000000000090910467ffffffffffffffff1690815f5b86811015612c65575f8a8a8381811061298557612985613bc8565b90506020028101906129979190613bf5565b6129a090613c31565b8051805160209091012060408201519192509067ffffffffffffffff1615612b8057856129cc81613cb7565b9650505f81836020015184604001518560600151604051602001612a2e9493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612ab6576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908d901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c50565b8151516201d4c01015612bbf576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020810187905290810182905260608082018a905260c089901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c5d90613cdd565b91505061296a565b5060075467ffffffffffffffff9081169084161115612cb0576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558567ffffffffffffffff84811690831614612d65575f612cd5838661384b565b9050612ceb67ffffffffffffffff8216836139c5565b9150612d247f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611bda6107ae565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e61337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e189190613807565b612e229190613d14565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692919061304d565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff88166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2191906139de565b90508067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76688604051612f5f91815260200190565b60405180910390a25050505050505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526130489084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b1565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526130ab9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612fc6565b50505050565b5f613112826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131bc9092919063ffffffff16565b805190915015613048578080602001905181019061313091906138fc565b613048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e22565b606061214984845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ee9190614046565b5f6040518083038185875af1925050503d805f8114613228576040519150601f19603f3d011682016040523d82523d5f602084013e61322d565b606091505b509150915061323e87838387613249565b979650505050505050565b606083156132de5782515f036132d75773ffffffffffffffffffffffffffffffffffffffff85163b6132d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e22565b5081612149565b61214983838151156132f35781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e229190613392565b5f5b83811015613341578181015183820152602001613329565b50505f910152565b5f8151808452613360816020860160208601613327565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6133a46020830184613349565b9392505050565b67ffffffffffffffff811681146133c0575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff811681146133c0575f80fd5b5f805f606084860312156133f6575f80fd5b8335613401816133ab565b9250602084013591506040840135613418816133c3565b809150509250925092565b5f60208284031215613433575f80fd5b81356133a4816133ab565b5f6020828403121561344e575f80fd5b81356133a4816133c3565b63ffffffff811681146133c0575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134de576134de61346a565b604052919050565b5f67ffffffffffffffff8211156134ff576134ff61346a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261353a575f80fd5b813561354d613548826134e6565b613497565b818152846020838601011115613561575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613592575f80fd5b863561359d816133c3565b955060208701356135ad816133c3565b945060408701356135bd81613459565b935060608701356135cd816133c3565b9250608087013567ffffffffffffffff808211156135e9575f80fd5b6135f58a838b0161352b565b935060a089013591508082111561360a575f80fd5b5061361789828a0161352b565b9150509295509295509295565b5f8083601f840112613634575f80fd5b50813567ffffffffffffffff81111561364b575f80fd5b6020830191508360208260051b8501011115613665575f80fd5b9250929050565b5f806020838503121561367d575f80fd5b823567ffffffffffffffff811115613693575f80fd5b61369f85828601613624565b90969095509350505050565b5f805f80608085870312156136be575f80fd5b84356136c981613459565b935060208501356136d9816133c3565b925060408501356136e981613459565b9150606085013567ffffffffffffffff811115613704575f80fd5b6137108782880161352b565b91505092959194509250565b5f6020828403121561372c575f80fd5b813567ffffffffffffffff811115613742575f80fd5b6121498482850161352b565b5f805f60408486031215613760575f80fd5b833567ffffffffffffffff80821115613777575f80fd5b818601915086601f83011261378a575f80fd5b813581811115613798575f80fd5b8760208285010111156137a9575f80fd5b6020928301989097509590910135949350505050565b5f805f604084860312156137d1575f80fd5b833567ffffffffffffffff8111156137e7575f80fd5b6137f386828701613624565b9094509250506020840135613418816133c3565b5f60208284031215613817575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561386c5761386c61381e565b5092915050565b5f826138a6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806138bf57607f821691505b6020821081036138f6577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f6020828403121561390c575f80fd5b815180151581146133a4575f80fd5b5f6020828403121561392b575f80fd5b815167ffffffffffffffff811115613941575f80fd5b8201601f81018413613951575f80fd5b805161395f613548826134e6565b818152856020838501011115613973575f80fd5b613984826020830160208601613327565b95945050505050565b5f806040838503121561399e575f80fd5b82516139a981613459565b60208401519092506139ba816133c3565b809150509250929050565b818103818111156139d8576139d861381e565b92915050565b5f602082840312156139ee575f80fd5b81516133a4816133ab565b601f821115613048575f81815260208120601f850160051c81016020861015613a1f5750805b601f850160051c820191505b8181101561276b57828155600101613a2b565b815167ffffffffffffffff811115613a5857613a5861346a565b613a6c81613a6684546138ab565b846139f9565b602080601f831160018114613abe575f8415613a885750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561276b565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b0a57888601518255948401946001909101908401613aeb565b5085821015613b4657878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613b686060830186613349565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561386c5761386c61381e565b808201808211156139d8576139d861381e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c27575f80fd5b9190910192915050565b5f60808236031215613c41575f80fd5b6040516080810167ffffffffffffffff8282108183111715613c6557613c6561346a565b816040528435915080821115613c79575f80fd5b50613c863682860161352b565b825250602083013560208201526040830135613ca1816133ab565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613cd357613cd361381e565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d0d57613d0d61381e565b5060010190565b80820281158282048414176139d8576139d861381e565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613d8160c0830184613349565b98975050505050505050565b61ffff81811683821601908082111561386c5761386c61381e565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e10816003860160208c01613327565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613e53816017840160208b01613327565b808201915050818660f81b16601782015284519150613e79826018830160208801613327565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613ef2816003860160208c01613327565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f35816017840160208b01613327565b808201915050818660f01b16601782015284519150613f5b826019830160208801613327565b016019019998505050505050505050565b5f8651613f7d818460208b01613327565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f8251613c2781846020870161332756fea2646970667358221220fe6aeb71b56662d290791f6a1324488b174587bd38fc3d970c536604115c100864736f6c63430008140033",
+ "bytecode": "0x61010060405234801562000011575f80fd5b506040516200441238038062004412833981016040819052620000349162000146565b6001600160a01b0380851660a05280841660805280831660c052811660e05283838383620000616200006f565b5050505050505050620001ab565b5f54610100900460ff1615620000db5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811610156200012c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811462000143575f80fd5b50565b5f805f80608085870312156200015a575f80fd5b845162000167816200012e565b60208601519094506200017a816200012e565b60408601519093506200018d816200012e565b6060860151909250620001a0816200012e565b939692955090935050565b60805160a05160c05160e0516141846200028e5f395f81816104f10152818161095501528181610ac101528181610d090152818161108b015281816115260152818161197501528181611a6a01528181612639015281816126b2015281816126d4015281816127e9015281816129890152612a4e01525f818161064a01528181611c3401528181611d3c0152818161218701528181612e3c0152612f1101525f818161070601528181610f02015281816122030152612b9601525f818161074b01528181610808015281816119be015281816127800152612b6b01526141845ff3fe608060405234801561000f575f80fd5b50600436106102d7575f3560e01c80637125702211610187578063c7fffd4b116100dd578063def57e5411610093578063eaeb077b1161006e578063eaeb077b14610781578063f35dda4714610794578063f851a4401461079c575f80fd5b8063def57e5414610733578063e46761c414610746578063e7a7ed021461076d575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff14610728575f80fd5b8063c7fffd4b146106c6578063c89e42df146106ce575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e575f80fd5b80639f26f84014610632578063a3c573eb14610645578063a652f26c1461066c575f80fd5b80638c3d73011161016d5780638c3d7301146105fc57806391cafe32146106045780639e00187714610617575f80fd5b806371257022146105ad5780637a5460c5146105c0575f80fd5b806340b5de6c1161023c57806352bdeb6d116101f25780636b8616ce116101cd5780636b8616ce146105725780636e05d2cd146105915780636ff512cc1461059a575f80fd5b806352bdeb6d14610526578063542028d514610562578063676870d21461056a575f80fd5b8063456052671161022257806345605267146104b357806349b7b802146104ec5780634e48770614610513575f80fd5b806340b5de6c1461045357806342308fab146104ab575f80fd5b8063267822471161029157806332c2d1531161027757806332c2d153146103e15780633c351e10146103f65780633cbc795b14610416575f80fd5b8063267822471461037c5780632c111c06146103c1575f80fd5b806305835f37116102c157806305835f3714610311578063107bf28c1461035a57806311e892d414610362575f80fd5b8062d0295d146102db57806303508963146102f6575b5f80fd5b6102e36107c1565b6040519081526020015b60405180910390f35b6102fe602081565b60405161ffff90911681526020016102ed565b61034d6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ed9190613459565b61034d6108c7565b61036a60f981565b60405160ff90911681526020016102ed565b60015461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b60085461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f46103ef3660046134ab565b610953565b005b60095461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461043e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ed565b61047a7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ed565b6102e3602481565b6007546104d39068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ed565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6103f46105213660046134ea565b610a22565b61034d6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61034d610c31565b6102fe601f81565b6102e36105803660046134ea565b60066020525f908152604090205481565b6102e360055481565b6103f46105a8366004613505565b610c3e565b6103f46105bb366004613644565b610d07565b61034d6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103f46112c0565b6103f4610612366004613505565b611392565b61039c73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103f4610640366004613733565b6114aa565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b61034d61067a366004613772565b611b36565b6103f461068d366004613505565b611f14565b6102e36405ca1ab1e081565b6007546104d390700100000000000000000000000000000000900467ffffffffffffffff1681565b61036a60e481565b6103f46106dc3660046137e3565b611fdd565b60025461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6102e3635ca1ab1e81565b6103f4610741366004613815565b61206f565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d39067ffffffffffffffff1681565b6103f461078f36600461388d565b612912565b61036a601b81565b5f5461039c9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087191906138fe565b6007549091505f9061089b9067ffffffffffffffff68010000000000000000820481169116613942565b67ffffffffffffffff169050805f036108b6575f9250505090565b6108c0818361396a565b9250505090565b600480546108d4906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610900906139a2565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c2576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1591815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a78576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610abf576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c91906139f3565b610bad5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bad576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d4906139a2565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c26565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d76576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d9457505f54600160ff909116105b80610dad5750303b158015610dad57505f5460ff166001145b610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610ea485612dd9565b6009549091505f90610eee90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611b36565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8d91906138fe565b90505f808483858f610fa0600143613a12565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190613a2b565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161119a9190613a8b565b5060046111a78982613a8b565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161124793929190613ba3565b60405180910390a150505050505080156112b7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611311576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146113e8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611437576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c26565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906114e8575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561151f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613a2b565b6115bb9190613be1565b67ffffffffffffffff1611156115fd576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611638576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611674576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161169c91849168010000000000000000900416613c02565b11156116d4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561196f575f87878381811061170f5761170f613c15565b90506020028101906117219190613c42565b61172a90613c7e565b90508361173681613d04565b825180516020918201208185015160408087015160608801519151959a509295505f946117a2948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461182a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561184e600188613a12565b84036118bd5742600760109054906101000a900467ffffffffffffffff16846040015161187b9190613be1565b67ffffffffffffffff1611156118bd576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061196790613d2a565b9150506116f4565b506119e57f00000000000000000000000000000000000000000000000000000000000000008461199d6107c1565b6119a79190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061303b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611ab6908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ad2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af69190613a2b565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611b6896959493929190613d78565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611cb85760f9601f8351611bfc9190613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ca29796959493929190613df5565b6040516020818303038152906040529050611dbc565b815161ffff1015611cf5576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611d04602083613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611da99796959493929190613ed7565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611e1a573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e92576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ed79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613fb9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c26565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612033576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361203f8282613a8b565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c269190613459565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120c0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036120fb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612137576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612142602442613c02565b8467ffffffffffffffff161115612185576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121ea575f80fd5b505af11580156121fc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e91906138fe565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b858110156125ac575f8b8b838181106122cc576122cc613c15565b90506020028101906122de9190613c42565b6122e790613c7e565b8051805160209091012060408201519192509067ffffffffffffffff16156124c7578561231381613d04565b9650505f818360200151846040015185606001516040516020016123759493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146123fd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612597565b8151516201d4c01015612506576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806125a490613d2a565b9150506122b1565b5060075467ffffffffffffffff90811690841611156125f7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146126ac575f61261c8386613942565b905061263267ffffffffffffffff821683613a12565b915061266b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661199d6107c1565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6127a8337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561273b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275f91906138fe565b6127699190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613114565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128689190613a2b565b90506128748782613942565b67ffffffffffffffff168967ffffffffffffffff16146128c0576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516128fc91815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612950575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612987576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1491906139f3565b15612a4b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad991906138fe565b905082811115612b15576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b51576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b9373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613114565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c2191906138fe565b6007805491925067ffffffffffffffff909116905f612c3f83613d04565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c76929190614014565b6040519081900390208142612c8c600143613a12565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612d82576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612dd1565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612dc890849033908b908b90614023565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613036576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612e80573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ec59190810190614093565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015612f57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7b9190614105565b915091508163ffffffff165f14612ff2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613033565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261310f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613178565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131729085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161308d565b50505050565b5f6131d9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132839092919063ffffffff16565b80519091501561310f57808060200190518101906131f791906139f3565b61310f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e35565b6060611f0c84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516132b5919061413d565b5f6040518083038185875af1925050503d805f81146132ef576040519150601f19603f3d011682016040523d82523d5f602084013e6132f4565b606091505b509150915061330587838387613310565b979650505050505050565b606083156133a55782515f0361339e5773ffffffffffffffffffffffffffffffffffffffff85163b61339e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e35565b5081611f0c565b611f0c83838151156133ba5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359190613459565b5f5b838110156134085781810151838201526020016133f0565b50505f910152565b5f81518084526134278160208601602086016133ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61346b6020830184613410565b9392505050565b67ffffffffffffffff81168114613487575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613487575f80fd5b5f805f606084860312156134bd575f80fd5b83356134c881613472565b92506020840135915060408401356134df8161348a565b809150509250925092565b5f602082840312156134fa575f80fd5b813561346b81613472565b5f60208284031215613515575f80fd5b813561346b8161348a565b63ffffffff81168114613487575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a5576135a5613531565b604052919050565b5f67ffffffffffffffff8211156135c6576135c6613531565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613601575f80fd5b813561361461360f826135ad565b61355e565b818152846020838601011115613628575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613659575f80fd5b86356136648161348a565b955060208701356136748161348a565b9450604087013561368481613520565b935060608701356136948161348a565b9250608087013567ffffffffffffffff808211156136b0575f80fd5b6136bc8a838b016135f2565b935060a08901359150808211156136d1575f80fd5b506136de89828a016135f2565b9150509295509295509295565b5f8083601f8401126136fb575f80fd5b50813567ffffffffffffffff811115613712575f80fd5b6020830191508360208260051b850101111561372c575f80fd5b9250929050565b5f8060208385031215613744575f80fd5b823567ffffffffffffffff81111561375a575f80fd5b613766858286016136eb565b90969095509350505050565b5f805f8060808587031215613785575f80fd5b843561379081613520565b935060208501356137a08161348a565b925060408501356137b081613520565b9150606085013567ffffffffffffffff8111156137cb575f80fd5b6137d7878288016135f2565b91505092959194509250565b5f602082840312156137f3575f80fd5b813567ffffffffffffffff811115613809575f80fd5b611f0c848285016135f2565b5f805f805f60808688031215613829575f80fd5b853567ffffffffffffffff81111561383f575f80fd5b61384b888289016136eb565b909650945050602086013561385f81613472565b9250604086013561386f81613472565b9150606086013561387f8161348a565b809150509295509295909350565b5f805f6040848603121561389f575f80fd5b833567ffffffffffffffff808211156138b6575f80fd5b818601915086601f8301126138c9575f80fd5b8135818111156138d7575f80fd5b8760208285010111156138e8575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561390e575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561396357613963613915565b5092915050565b5f8261399d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806139b657607f821691505b6020821081036139ed577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613a03575f80fd5b8151801515811461346b575f80fd5b81810381811115613a2557613a25613915565b92915050565b5f60208284031215613a3b575f80fd5b815161346b81613472565b601f82111561310f575f81815260208120601f850160051c81016020861015613a6c5750805b601f850160051c820191505b81811015612dd157828155600101613a78565b815167ffffffffffffffff811115613aa557613aa5613531565b613ab981613ab384546139a2565b84613a46565b602080601f831160018114613b0b575f8415613ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612dd1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b5757888601518255948401946001909101908401613b38565b5085821015613b9357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613bb56060830186613410565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561396357613963613915565b80820180821115613a2557613a25613915565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c74575f80fd5b9190910192915050565b5f60808236031215613c8e575f80fd5b6040516080810167ffffffffffffffff8282108183111715613cb257613cb2613531565b816040528435915080821115613cc6575f80fd5b50613cd3368286016135f2565b825250602083013560208201526040830135613cee81613472565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613d2057613d20613915565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5a57613d5a613915565b5060010190565b8082028115828204841417613a2557613a25613915565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613dce60c0830184613410565b98975050505050505050565b61ffff81811683821601908082111561396357613963613915565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e5d816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613ea0816017840160208b016133ee565b808201915050818660f81b16601782015284519150613ec68260188301602088016133ee565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613f3f816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f82816017840160208b016133ee565b808201915050818660f01b16601782015284519150613fa88260198301602088016133ee565b016019019998505050505050505050565b5f8651613fca818460208b016133ee565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156140a3575f80fd5b815167ffffffffffffffff8111156140b9575f80fd5b8201601f810184136140c9575f80fd5b80516140d761360f826135ad565b8181528560208385010111156140eb575f80fd5b6140fc8260208301602086016133ee565b95945050505050565b5f8060408385031215614116575f80fd5b825161412181613520565b60208401519092506141328161348a565b809150509250929050565b5f8251613c748184602087016133ee56fea264697066735822122085db40c10ef8cab16b910c3133018cca1a119653290a680ee22bc3bb3a64056464736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102d7575f3560e01c80637125702211610187578063c7fffd4b116100dd578063def57e5411610093578063eaeb077b1161006e578063eaeb077b14610781578063f35dda4714610794578063f851a4401461079c575f80fd5b8063def57e5414610733578063e46761c414610746578063e7a7ed021461076d575f80fd5b8063cfa8ed47116100c3578063cfa8ed47146106e1578063d02103ca14610701578063d7bc90ff14610728575f80fd5b8063c7fffd4b146106c6578063c89e42df146106ce575f80fd5b80639f26f8401161013d578063ada8f91911610118578063ada8f9191461067f578063b0afe15414610692578063c754c7ed1461069e575f80fd5b80639f26f84014610632578063a3c573eb14610645578063a652f26c1461066c575f80fd5b80638c3d73011161016d5780638c3d7301146105fc57806391cafe32146106045780639e00187714610617575f80fd5b806371257022146105ad5780637a5460c5146105c0575f80fd5b806340b5de6c1161023c57806352bdeb6d116101f25780636b8616ce116101cd5780636b8616ce146105725780636e05d2cd146105915780636ff512cc1461059a575f80fd5b806352bdeb6d14610526578063542028d514610562578063676870d21461056a575f80fd5b8063456052671161022257806345605267146104b357806349b7b802146104ec5780634e48770614610513575f80fd5b806340b5de6c1461045357806342308fab146104ab575f80fd5b8063267822471161029157806332c2d1531161027757806332c2d153146103e15780633c351e10146103f65780633cbc795b14610416575f80fd5b8063267822471461037c5780632c111c06146103c1575f80fd5b806305835f37116102c157806305835f3714610311578063107bf28c1461035a57806311e892d414610362575f80fd5b8062d0295d146102db57806303508963146102f6575b5f80fd5b6102e36107c1565b6040519081526020015b60405180910390f35b6102fe602081565b60405161ffff90911681526020016102ed565b61034d6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516102ed9190613459565b61034d6108c7565b61036a60f981565b60405160ff90911681526020016102ed565b60015461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b60085461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b6103f46103ef3660046134ab565b610953565b005b60095461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461043e9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016102ed565b61047a7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff0000000000000000000000000000000000000000000000000000000000000090911681526020016102ed565b6102e3602481565b6007546104d39068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016102ed565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6103f46105213660046134ea565b610a22565b61034d6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61034d610c31565b6102fe601f81565b6102e36105803660046134ea565b60066020525f908152604090205481565b6102e360055481565b6103f46105a8366004613505565b610c3e565b6103f46105bb366004613644565b610d07565b61034d6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b6103f46112c0565b6103f4610612366004613505565b611392565b61039c73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b6103f4610640366004613733565b6114aa565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b61034d61067a366004613772565b611b36565b6103f461068d366004613505565b611f14565b6102e36405ca1ab1e081565b6007546104d390700100000000000000000000000000000000900467ffffffffffffffff1681565b61036a60e481565b6103f46106dc3660046137e3565b611fdd565b60025461039c9073ffffffffffffffffffffffffffffffffffffffff1681565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6102e3635ca1ab1e81565b6103f4610741366004613815565b61206f565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104d39067ffffffffffffffff1681565b6103f461078f36600461388d565b612912565b61036a601b81565b5f5461039c9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087191906138fe565b6007549091505f9061089b9067ffffffffffffffff68010000000000000000820481169116613942565b67ffffffffffffffff169050805f036108b6575f9250505090565b6108c0818361396a565b9250505090565b600480546108d4906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610900906139a2565b801561094b5780601f106109225761010080835404028352916020019161094b565b820191905f5260205f20905b81548152906001019060200180831161092e57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109c2576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a1591815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a78576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610abf576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c91906139f3565b610bad5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bad576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546108d4906139a2565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c26565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610d76576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d9457505f54600160ff909116105b80610dad5750303b158015610dad57505f5460ff166001145b610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e9a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f610ea485612dd9565b6009549091505f90610eee90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff1685611b36565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8d91906138fe565b90505f808483858f610fa0600143613a12565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af11580156110e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190613a2b565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161119a9190613a8b565b5060046111a78982613a8b565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e60405161124793929190613ba3565b60405180910390a150505050505080156112b7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611311576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146113e8576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611437576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c26565b60085473ffffffffffffffffffffffffffffffffffffffff1680158015906114e8575073ffffffffffffffffffffffffffffffffffffffff81163314155b1561151f576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613a2b565b6115bb9190613be1565b67ffffffffffffffff1611156115fd576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611638576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611674576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff8082169161169c91849168010000000000000000900416613c02565b11156116d4576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b8381101561196f575f87878381811061170f5761170f613c15565b90506020028101906117219190613c42565b61172a90613c7e565b90508361173681613d04565b825180516020918201208185015160408087015160608801519151959a509295505f946117a2948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f9081526006909352912054909150811461182a576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526006602052604081205561184e600188613a12565b84036118bd5742600760109054906101000a900467ffffffffffffffff16846040015161187b9190613be1565b67ffffffffffffffff1611156118bd576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc01604051602081830303815290604052805190602001209450505050808061196790613d2a565b9150506116f4565b506119e57f00000000000000000000000000000000000000000000000000000000000000008461199d6107c1565b6119a79190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061303b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390611ab6908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611ad2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af69190613a2b565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f87604051602401611b6896959493929190613d78565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f03611cb85760f9601f8351611bfc9190613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e487604051602001611ca29796959493929190613df5565b6040516020818303038152906040529050611dbc565b815161ffff1015611cf5576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f9611d04602083613dda565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001611da99796959493929190613ed7565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa158015611e1a573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611e92576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f90611ed79084906405ca1ab1e090635ca1ab1e90601b907fff0000000000000000000000000000000000000000000000000000000000000090602001613fb9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611f6a576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c26565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612033576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361203f8282613a8b565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c269190613459565b60025473ffffffffffffffffffffffffffffffffffffffff1633146120c0576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036120fb576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612137576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612142602442613c02565b8467ffffffffffffffff161115612185576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156121ea575f80fd5b505af11580156121fc573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa15801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e91906138fe565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b858110156125ac575f8b8b838181106122cc576122cc613c15565b90506020028101906122de9190613c42565b6122e790613c7e565b8051805160209091012060408201519192509067ffffffffffffffff16156124c7578561231381613d04565b9650505f818360200151846040015185606001516040516020016123759493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146123fd576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612597565b8151516201d4c01015612506576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b505080806125a490613d2a565b9150506122b1565b5060075467ffffffffffffffff90811690841611156125f7576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff848116908316146126ac575f61261c8386613942565b905061263267ffffffffffffffff821683613a12565b915061266b7f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff1661199d6107c1565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b6127a8337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa15801561273b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061275f91906138fe565b6127699190613d61565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190613114565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612844573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128689190613a2b565b90506128748782613942565b67ffffffffffffffff168967ffffffffffffffff16146128c0576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e766876040516128fc91815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612950575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612987576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1491906139f3565b15612a4b576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad991906138fe565b905082811115612b15576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115612b51576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b9373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084613114565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c2191906138fe565b6007805491925067ffffffffffffffff909116905f612c3f83613d04565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051612c76929190614014565b6040519081900390208142612c8c600143613a12565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303612d82576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2612dd1565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc93190612dc890849033908b908b90614023565b60405180910390a25b505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613036576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015612e80573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ec59190810190614093565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015612f57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f7b9190614105565b915091508163ffffffff165f14612ff2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613033565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261310f9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613178565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526131729085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161308d565b50505050565b5f6131d9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132839092919063ffffffff16565b80519091501561310f57808060200190518101906131f791906139f3565b61310f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610e35565b6060611f0c84845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516132b5919061413d565b5f6040518083038185875af1925050503d805f81146132ef576040519150601f19603f3d011682016040523d82523d5f602084013e6132f4565b606091505b509150915061330587838387613310565b979650505050505050565b606083156133a55782515f0361339e5773ffffffffffffffffffffffffffffffffffffffff85163b61339e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e35565b5081611f0c565b611f0c83838151156133ba5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e359190613459565b5f5b838110156134085781810151838201526020016133f0565b50505f910152565b5f81518084526134278160208601602086016133ee565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61346b6020830184613410565b9392505050565b67ffffffffffffffff81168114613487575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613487575f80fd5b5f805f606084860312156134bd575f80fd5b83356134c881613472565b92506020840135915060408401356134df8161348a565b809150509250925092565b5f602082840312156134fa575f80fd5b813561346b81613472565b5f60208284031215613515575f80fd5b813561346b8161348a565b63ffffffff81168114613487575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156135a5576135a5613531565b604052919050565b5f67ffffffffffffffff8211156135c6576135c6613531565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613601575f80fd5b813561361461360f826135ad565b61355e565b818152846020838601011115613628575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f8060c08789031215613659575f80fd5b86356136648161348a565b955060208701356136748161348a565b9450604087013561368481613520565b935060608701356136948161348a565b9250608087013567ffffffffffffffff808211156136b0575f80fd5b6136bc8a838b016135f2565b935060a08901359150808211156136d1575f80fd5b506136de89828a016135f2565b9150509295509295509295565b5f8083601f8401126136fb575f80fd5b50813567ffffffffffffffff811115613712575f80fd5b6020830191508360208260051b850101111561372c575f80fd5b9250929050565b5f8060208385031215613744575f80fd5b823567ffffffffffffffff81111561375a575f80fd5b613766858286016136eb565b90969095509350505050565b5f805f8060808587031215613785575f80fd5b843561379081613520565b935060208501356137a08161348a565b925060408501356137b081613520565b9150606085013567ffffffffffffffff8111156137cb575f80fd5b6137d7878288016135f2565b91505092959194509250565b5f602082840312156137f3575f80fd5b813567ffffffffffffffff811115613809575f80fd5b611f0c848285016135f2565b5f805f805f60808688031215613829575f80fd5b853567ffffffffffffffff81111561383f575f80fd5b61384b888289016136eb565b909650945050602086013561385f81613472565b9250604086013561386f81613472565b9150606086013561387f8161348a565b809150509295509295909350565b5f805f6040848603121561389f575f80fd5b833567ffffffffffffffff808211156138b6575f80fd5b818601915086601f8301126138c9575f80fd5b8135818111156138d7575f80fd5b8760208285010111156138e8575f80fd5b6020928301989097509590910135949350505050565b5f6020828403121561390e575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561396357613963613915565b5092915050565b5f8261399d577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c908216806139b657607f821691505b6020821081036139ed577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215613a03575f80fd5b8151801515811461346b575f80fd5b81810381811115613a2557613a25613915565b92915050565b5f60208284031215613a3b575f80fd5b815161346b81613472565b601f82111561310f575f81815260208120601f850160051c81016020861015613a6c5750805b601f850160051c820191505b81811015612dd157828155600101613a78565b815167ffffffffffffffff811115613aa557613aa5613531565b613ab981613ab384546139a2565b84613a46565b602080601f831160018114613b0b575f8415613ad55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612dd1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b5757888601518255948401946001909101908401613b38565b5085821015613b9357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b606081525f613bb56060830186613410565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff81811683821601908082111561396357613963613915565b80820180821115613a2557613a25613915565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112613c74575f80fd5b9190910192915050565b5f60808236031215613c8e575f80fd5b6040516080810167ffffffffffffffff8282108183111715613cb257613cb2613531565b816040528435915080821115613cc6575f80fd5b50613cd3368286016135f2565b825250602083013560208201526040830135613cee81613472565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff808316818103613d2057613d20613915565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d5a57613d5a613915565b5060010190565b8082028115828204841417613a2557613a25613915565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a0830152613dce60c0830184613410565b98975050505050505050565b61ffff81811683821601908082111561396357613963613915565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751613e5d816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613ea0816017840160208b016133ee565b808201915050818660f81b16601782015284519150613ec68260188301602088016133ee565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b1660018401528751613f3f816003860160208c016133ee565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651613f82816017840160208b016133ee565b808201915050818660f01b16601782015284519150613fa88260198301602088016133ee565b016019019998505050505050505050565b5f8651613fca818460208b016133ee565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f602082840312156140a3575f80fd5b815167ffffffffffffffff8111156140b9575f80fd5b8201601f810184136140c9575f80fd5b80516140d761360f826135ad565b8181528560208385010111156140eb575f80fd5b6140fc8260208301602086016133ee565b95945050505050565b5f8060408385031215614116575f80fd5b825161412181613520565b60208401519092506141328161348a565b809150509250929050565b5f8251613c748184602087016133ee56fea264697066735822122085db40c10ef8cab16b910c3133018cca1a119653290a680ee22bc3bb3a64056464736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMExistentEtrog.json b/compiled-contracts/PolygonZkEVMExistentEtrog.json
index d8594c2e7..9b7df33f1 100644
--- a/compiled-contracts/PolygonZkEVMExistentEtrog.json
+++ b/compiled-contracts/PolygonZkEVMExistentEtrog.json
@@ -44,6 +44,11 @@
"name": "ExceedMaxVerifyBatches",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "FinalAccInputHashDoesNotMatch",
+ "type": "error"
+ },
{
"inputs": [],
"name": "FinalNumBatchBelowLastVerifiedBatch",
@@ -159,6 +164,11 @@
"name": "InvalidRangeMultiplierBatchFee",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "L1InfoTreeLeafCountInvalid",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MaxTimestampSequenceInvalid",
@@ -366,6 +376,25 @@
"name": "Initialized",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RollbackBatches",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -1055,6 +1084,24 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [
+ {
+ "internalType": "uint64",
+ "name": "targetBatch",
+ "type": "uint64"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "accInputHashToRollback",
+ "type": "bytes32"
+ }
+ ],
+ "name": "rollbackBatches",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
{
"inputs": [],
"name": "rollupManager",
@@ -1097,15 +1144,20 @@
"name": "batches",
"type": "tuple[]"
},
+ {
+ "internalType": "uint32",
+ "name": "l1InfoTreeLeafCount",
+ "type": "uint32"
+ },
{
"internalType": "uint64",
"name": "maxSequenceTimestamp",
"type": "uint64"
},
{
- "internalType": "uint64",
- "name": "initSequencedBatch",
- "type": "uint64"
+ "internalType": "bytes32",
+ "name": "expectedFinalAccInputHash",
+ "type": "bytes32"
},
{
"internalType": "address",
@@ -1245,8 +1297,8 @@
"type": "function"
}
],
- "bytecode": "0x61010060405234801562000011575f80fd5b5060405162004a5638038062004a5683398101604081905262000034916200006f565b6001600160a01b0393841660a052918316608052821660c0521660e052620000d4565b6001600160a01b03811681146200006c575f80fd5b50565b5f805f806080858703121562000083575f80fd5b8451620000908162000057565b6020860151909450620000a38162000057565b6040860151909350620000b68162000057565b6060860151909250620000c98162000057565b939692955090935050565b60805160a05160c05160e05161488a620001cc5f395f81816105070152818161098601528181610af201528181610c7101528181610fbb015281816112bd0152818161163a01528181611ad501528181611f240152818161201901528181612c0401528181612c7d01528181612c9f01528181612db401528181612f54015261301901525f8181610673015281816121e3015281816122eb015281816127520152818161340601526134db01525f818161073701528181610e30015281816114b1015281816127ce015261316101525f818161077c0152818161083901528181611f6d01528181612d4b0152613136015261488a5ff3fe608060405234801561000f575f80fd5b50600436106102ed575f3560e01c80637125702211610192578063c754c7ed116100e8578063def57e5411610093578063eaeb077b1161006e578063eaeb077b146107b2578063f35dda47146107c5578063f851a440146107cd575f80fd5b8063def57e5414610764578063e46761c414610777578063e7a7ed021461079e575f80fd5b8063cfa8ed47116100c3578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff14610759575f80fd5b8063c754c7ed146106cf578063c7fffd4b146106f7578063c89e42df146106ff575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f919146106a8578063af7f3e02146106bb578063b0afe154146106c3575f80fd5b80639f26f8401461065b578063a3c573eb1461066e578063a652f26c14610695575f80fd5b80638c3d7301116101785780638c3d73011461062557806391cafe321461062d5780639e00187714610640575f80fd5b806371257022146105d65780637a5460c5146105e9575f80fd5b806342308fab11610247578063542028d5116101fd5780636b8616ce116101d85780636b8616ce1461059b5780636e05d2cd146105ba5780636ff512cc146105c3575f80fd5b8063542028d5146105785780635d6717a514610580578063676870d214610593575f80fd5b806349b7b8021161022d57806349b7b802146105025780634e4877061461052957806352bdeb6d1461053c575f80fd5b806342308fab146104c157806345605267146104c9575f80fd5b806326782247116102a75780633c351e10116102825780633c351e101461040c5780633cbc795b1461042c57806340b5de6c14610469575f80fd5b806326782247146103925780632c111c06146103d757806332c2d153146103f7575f80fd5b806305835f37116102d757806305835f3714610327578063107bf28c1461037057806311e892d414610378575f80fd5b8062d0295d146102f1578063035089631461030c575b5f80fd5b6102f96107f2565b6040519081526020015b60405180910390f35b610314602081565b60405161ffff9091168152602001610303565b6103636040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103039190613a23565b6103636108f8565b61038060f981565b60405160ff9091168152602001610303565b6001546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610303565b6008546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b61040a610405366004613a75565b610984565b005b6009546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104549074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610303565b6104907fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610303565b6102f9602481565b6007546104e99068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610303565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b61040a610537366004613ab4565b610a53565b6103636040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610363610c62565b61040a61058e366004613be2565b610c6f565b610314601f81565b6102f96105a9366004613ab4565b60066020525f908152604090205481565b6102f960055481565b61040a6105d1366004613c6d565b6111f2565b61040a6105e4366004613c99565b6112bb565b6103636040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040a61186f565b61040a61063b366004613c6d565b611941565b6103b273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61040a610669366004613d88565b611a59565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6103636106a3366004613dc7565b6120e5565b61040a6106b6366004613c6d565b6124c3565b61036361258c565b6102f96405ca1ab1e081565b6007546104e990700100000000000000000000000000000000900467ffffffffffffffff1681565b61038060e481565b61040a61070d366004613e38565b6125a8565b6002546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6102f9635ca1ab1e81565b61040a610772366004613e6a565b61263a565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e99067ffffffffffffffff1681565b61040a6107c0366004613ee2565b612edd565b610380601b81565b5f546103b29062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561087e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a29190613f53565b6007549091505f906108cc9067ffffffffffffffff68010000000000000000820481169116613f97565b67ffffffffffffffff169050805f036108e7575f9250505090565b6108f18183613fbf565b9250505090565b6004805461090590613ff7565b80601f016020809104026020016040519081016040528092919081815260200182805461093190613ff7565b801561097c5780601f106109535761010080835404028352916020019161097c565b820191905f5260205f20905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4691815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aa9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610af0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7d9190614048565b610bde5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bde576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090590613ff7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cde576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610cfc57505f54600160ff909116105b80610d155750303b158015610d1557505f5460ff166001145b610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e02575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016147f36062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebb9190613f53565b90505f868483858d610ece600143614067565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611016573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103a9190614080565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110cb91906140e0565b5060046110d88a826140e0565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e60405161117a94939291906141f8565b60405180910390a150505050505080156111ea575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611248576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c57565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461132a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561134857505f54600160ff909116105b806113615750303b15801561136157505f5460ff166001145b6113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9d565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611449575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611453856133a3565b6009549091505f9061149d90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856120e5565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153c9190613f53565b90505f808483858f61154f600143614067565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b99190614080565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161174991906140e0565b50600461175689826140e0565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516117f693929190614247565b60405180910390a15050505050508015611866575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146118c0576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611997576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166119e6576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c57565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611a97575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611ace576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b609190614080565b611b6a9190614285565b67ffffffffffffffff161115611bac576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611be7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611c23576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611c4b918491680100000000000000009004166142a6565b1115611c83576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611f1e575f878783818110611cbe57611cbe6142b9565b9050602002810190611cd091906142e6565b611cd990614322565b905083611ce5816143a8565b825180516020918201208185015160408087015160608801519151959a509295505f94611d51948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611dd9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611dfd600188614067565b8403611e6c5742600760109054906101000a900467ffffffffffffffff168460400151611e2a9190614285565b67ffffffffffffffff161115611e6c576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611f16906143ce565b915050611ca3565b50611f947f000000000000000000000000000000000000000000000000000000000000000084611f4c6107f2565b611f569190614405565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613605565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612065908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a59190614080565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016121179695949392919061441c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036122675760f9601f83516121ab919061447e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016122519796959493929190614499565b604051602081830303815290604052905061236b565b815161ffff10156122a4576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96122b360208361447e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612358979695949392919061457b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156123c9573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612441576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906124869084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161465d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612519576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c57565b6040518060a00160405280606281526020016147f36062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146125fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361260a82826140e0565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c579190613a23565b60025473ffffffffffffffffffffffffffffffffffffffff16331461268b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036126c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612702576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270d6024426142a6565b8467ffffffffffffffff161115612750576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156127b5575f80fd5b505af11580156127c7573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190613f53565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b85811015612b77575f8b8b83818110612897576128976142b9565b90506020028101906128a991906142e6565b6128b290614322565b8051805160209091012060408201519192509067ffffffffffffffff1615612a9257856128de816143a8565b9650505f818360200151846040015185606001516040516020016129409493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146129c8576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612b62565b8151516201d4c01015612ad1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612b6f906143ce565b91505061287c565b5060075467ffffffffffffffff9081169084161115612bc2576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614612c77575f612be78386613f97565b9050612bfd67ffffffffffffffff821683614067565b9150612c367f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f4c6107f2565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612d73337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2a9190613f53565b612d349190614405565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136de565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e339190614080565b9050612e3f8782613f97565b67ffffffffffffffff168967ffffffffffffffff1614612e8b576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051612ec791815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612f1b575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612f52576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdf9190614048565b15613016576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015613080573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a49190613f53565b9050828111156130e0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561311c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315e73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136de565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ec9190613f53565b6007805491925067ffffffffffffffff909116905f61320a836143a8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505085856040516132419291906146b8565b6040519081900390208142613257600143614067565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361334d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111ea565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061339390849033908b908b906146c7565b60405180910390a2505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613600576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa15801561344a573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261348f9190810190614737565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613521573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354591906147a9565b915091508163ffffffff165f146135bc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556135fd565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136d99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613742565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261373c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613657565b50505050565b5f6137a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661384d9092919063ffffffff16565b8051909150156136d957808060200190518101906137c19190614048565b6136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9d565b60606124bb84845f85855f808673ffffffffffffffffffffffffffffffffffffffff16858760405161387f91906147e1565b5f6040518083038185875af1925050503d805f81146138b9576040519150601f19603f3d011682016040523d82523d5f602084013e6138be565b606091505b50915091506138cf878383876138da565b979650505050505050565b6060831561396f5782515f036139685773ffffffffffffffffffffffffffffffffffffffff85163b613968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9d565b50816124bb565b6124bb83838151156139845781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9190613a23565b5f5b838110156139d25781810151838201526020016139ba565b50505f910152565b5f81518084526139f18160208601602086016139b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613a3560208301846139da565b9392505050565b67ffffffffffffffff81168114613a51575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a51575f80fd5b5f805f60608486031215613a87575f80fd5b8335613a9281613a3c565b9250602084013591506040840135613aa981613a54565b809150509250925092565b5f60208284031215613ac4575f80fd5b8135613a3581613a3c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b4357613b43613acf565b604052919050565b5f67ffffffffffffffff821115613b6457613b64613acf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613b9f575f80fd5b8135613bb2613bad82613b4b565b613afc565b818152846020838601011115613bc6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613bf6575f80fd5b8535613c0181613a54565b94506020860135613c1181613a54565b9350604086013567ffffffffffffffff80821115613c2d575f80fd5b613c3989838a01613b90565b94506060880135915080821115613c4e575f80fd5b50613c5b88828901613b90565b95989497509295608001359392505050565b5f60208284031215613c7d575f80fd5b8135613a3581613a54565b63ffffffff81168114613a51575f80fd5b5f805f805f8060c08789031215613cae575f80fd5b8635613cb981613a54565b95506020870135613cc981613a54565b94506040870135613cd981613c88565b93506060870135613ce981613a54565b9250608087013567ffffffffffffffff80821115613d05575f80fd5b613d118a838b01613b90565b935060a0890135915080821115613d26575f80fd5b50613d3389828a01613b90565b9150509295509295509295565b5f8083601f840112613d50575f80fd5b50813567ffffffffffffffff811115613d67575f80fd5b6020830191508360208260051b8501011115613d81575f80fd5b9250929050565b5f8060208385031215613d99575f80fd5b823567ffffffffffffffff811115613daf575f80fd5b613dbb85828601613d40565b90969095509350505050565b5f805f8060808587031215613dda575f80fd5b8435613de581613c88565b93506020850135613df581613a54565b92506040850135613e0581613c88565b9150606085013567ffffffffffffffff811115613e20575f80fd5b613e2c87828801613b90565b91505092959194509250565b5f60208284031215613e48575f80fd5b813567ffffffffffffffff811115613e5e575f80fd5b6124bb84828501613b90565b5f805f805f60808688031215613e7e575f80fd5b853567ffffffffffffffff811115613e94575f80fd5b613ea088828901613d40565b9096509450506020860135613eb481613a3c565b92506040860135613ec481613a3c565b91506060860135613ed481613a54565b809150509295509295909350565b5f805f60408486031215613ef4575f80fd5b833567ffffffffffffffff80821115613f0b575f80fd5b818601915086601f830112613f1e575f80fd5b813581811115613f2c575f80fd5b876020828501011115613f3d575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215613f63575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613fb857613fb8613f6a565b5092915050565b5f82613ff2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061400b57607f821691505b602082108103614042577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215614058575f80fd5b81518015158114613a35575f80fd5b8181038181111561407a5761407a613f6a565b92915050565b5f60208284031215614090575f80fd5b8151613a3581613a3c565b601f8211156136d9575f81815260208120601f850160051c810160208610156140c15750805b601f850160051c820191505b818110156111ea578281556001016140cd565b815167ffffffffffffffff8111156140fa576140fa613acf565b61410e816141088454613ff7565b8461409b565b602080601f831160018114614160575f841561412a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111ea565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156141ac5788860151825594840194600190910190840161418d565b50858210156141e857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f61421a60808301866139da565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b606081525f61425960608301866139da565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613fb857613fb8613f6a565b8082018082111561407a5761407a613f6a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614318575f80fd5b9190910192915050565b5f60808236031215614332575f80fd5b6040516080810167ffffffffffffffff828210818311171561435657614356613acf565b81604052843591508082111561436a575f80fd5b5061437736828601613b90565b82525060208301356020820152604083013561439281613a3c565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff8083168181036143c4576143c4613f6a565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143fe576143fe613f6a565b5060010190565b808202811582820484141761407a5761407a613f6a565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261447260c08301846139da565b98975050505050505050565b61ffff818116838216019080821115613fb857613fb8613f6a565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614501816003860160208c016139b8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614544816017840160208b016139b8565b808201915050818660f81b1660178201528451915061456a8260188301602088016139b8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516145e3816003860160208c016139b8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614626816017840160208b016139b8565b808201915050818660f01b1660178201528451915061464c8260198301602088016139b8565b016019019998505050505050505050565b5f865161466e818460208b016139b8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f60208284031215614747575f80fd5b815167ffffffffffffffff81111561475d575f80fd5b8201601f8101841361476d575f80fd5b805161477b613bad82613b4b565b81815285602083850101111561478f575f80fd5b6147a08260208301602086016139b8565b95945050505050565b5f80604083850312156147ba575f80fd5b82516147c581613c88565b60208401519092506147d681613a54565b809150509250929050565b5f82516143188184602087016139b856fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212205f7eb0c1f6419540d705e6d0820952b7eada1c659c98f5a2aaf1e215cc716ea064736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102ed575f3560e01c80637125702211610192578063c754c7ed116100e8578063def57e5411610093578063eaeb077b1161006e578063eaeb077b146107b2578063f35dda47146107c5578063f851a440146107cd575f80fd5b8063def57e5414610764578063e46761c414610777578063e7a7ed021461079e575f80fd5b8063cfa8ed47116100c3578063cfa8ed4714610712578063d02103ca14610732578063d7bc90ff14610759575f80fd5b8063c754c7ed146106cf578063c7fffd4b146106f7578063c89e42df146106ff575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f919146106a8578063af7f3e02146106bb578063b0afe154146106c3575f80fd5b80639f26f8401461065b578063a3c573eb1461066e578063a652f26c14610695575f80fd5b80638c3d7301116101785780638c3d73011461062557806391cafe321461062d5780639e00187714610640575f80fd5b806371257022146105d65780637a5460c5146105e9575f80fd5b806342308fab11610247578063542028d5116101fd5780636b8616ce116101d85780636b8616ce1461059b5780636e05d2cd146105ba5780636ff512cc146105c3575f80fd5b8063542028d5146105785780635d6717a514610580578063676870d214610593575f80fd5b806349b7b8021161022d57806349b7b802146105025780634e4877061461052957806352bdeb6d1461053c575f80fd5b806342308fab146104c157806345605267146104c9575f80fd5b806326782247116102a75780633c351e10116102825780633c351e101461040c5780633cbc795b1461042c57806340b5de6c14610469575f80fd5b806326782247146103925780632c111c06146103d757806332c2d153146103f7575f80fd5b806305835f37116102d757806305835f3714610327578063107bf28c1461037057806311e892d414610378575f80fd5b8062d0295d146102f1578063035089631461030c575b5f80fd5b6102f96107f2565b6040519081526020015b60405180910390f35b610314602081565b60405161ffff9091168152602001610303565b6103636040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b6040516103039190613a23565b6103636108f8565b61038060f981565b60405160ff9091168152602001610303565b6001546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610303565b6008546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b61040a610405366004613a75565b610984565b005b6009546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b6009546104549074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610303565b6104907fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff000000000000000000000000000000000000000000000000000000000000009091168152602001610303565b6102f9602481565b6007546104e99068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610303565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b61040a610537366004613ab4565b610a53565b6103636040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b610363610c62565b61040a61058e366004613be2565b610c6f565b610314601f81565b6102f96105a9366004613ab4565b60066020525f908152604090205481565b6102f960055481565b61040a6105d1366004613c6d565b6111f2565b61040a6105e4366004613c99565b6112bb565b6103636040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b61040a61186f565b61040a61063b366004613c6d565b611941565b6103b273a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b61040a610669366004613d88565b611a59565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6103636106a3366004613dc7565b6120e5565b61040a6106b6366004613c6d565b6124c3565b61036361258c565b6102f96405ca1ab1e081565b6007546104e990700100000000000000000000000000000000900467ffffffffffffffff1681565b61038060e481565b61040a61070d366004613e38565b6125a8565b6002546103b29073ffffffffffffffffffffffffffffffffffffffff1681565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6102f9635ca1ab1e81565b61040a610772366004613e6a565b61263a565b6103b27f000000000000000000000000000000000000000000000000000000000000000081565b6007546104e99067ffffffffffffffff1681565b61040a6107c0366004613ee2565b612edd565b610380601b81565b5f546103b29062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561087e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a29190613f53565b6007549091505f906108cc9067ffffffffffffffff68010000000000000000820481169116613f97565b67ffffffffffffffff169050805f036108e7575f9250505090565b6108f18183613fbf565b9250505090565b6004805461090590613ff7565b80601f016020809104026020016040519081016040528092919081815260200182805461093190613ff7565b801561097c5780601f106109535761010080835404028352916020019161097c565b820191905f5260205f20905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146109f3576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a4691815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610aa9576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610af0576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7d9190614048565b610bde5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bde576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b6003805461090590613ff7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cde576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610cfc57505f54600160ff909116105b80610d155750303b158015610d1557505f5460ff166001145b610da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e02575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a00160405280606281526020016147f36062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebb9190613f53565b90505f868483858d610ece600143614067565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611016573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103a9190614080565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110cb91906140e0565b5060046110d88a826140e0565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e60405161117a94939291906141f8565b60405180910390a150505050505080156111ea575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611248576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c57565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461132a576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561134857505f54600160ff909116105b806113615750303b15801561136157505f5460ff166001145b6113ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9d565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611449575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611453856133a3565b6009549091505f9061149d90889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856120e5565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153c9190613f53565b90505f808483858f61154f600143614067565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b99190614080565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161174991906140e0565b50600461175689826140e0565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516117f693929190614247565b60405180910390a15050505050508015611866575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146118c0576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611997576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff166119e6576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c57565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611a97575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611ace576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b609190614080565b611b6a9190614285565b67ffffffffffffffff161115611bac576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611be7576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611c23576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611c4b918491680100000000000000009004166142a6565b1115611c83576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611f1e575f878783818110611cbe57611cbe6142b9565b9050602002810190611cd091906142e6565b611cd990614322565b905083611ce5816143a8565b825180516020918201208185015160408087015160608801519151959a509295505f94611d51948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611dd9576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611dfd600188614067565b8403611e6c5742600760109054906101000a900467ffffffffffffffff168460400151611e2a9190614285565b67ffffffffffffffff161115611e6c576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611f16906143ce565b915050611ca3565b50611f947f000000000000000000000000000000000000000000000000000000000000000084611f4c6107f2565b611f569190614405565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190613605565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e7390612065908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a59190614080565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016121179695949392919061441c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f036122675760f9601f83516121ab919061447e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e4876040516020016122519796959493929190614499565b604051602081830303815290604052905061236b565b815161ffff10156122a4576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96122b360208361447e565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b90000000000000000000000000000000000000000000000000000000000008152508588604051602001612358979695949392919061457b565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa1580156123c9573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612441576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f906124869084906405ca1ab1e090635ca1ab1e90601b907fff000000000000000000000000000000000000000000000000000000000000009060200161465d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612519576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c57565b6040518060a00160405280606281526020016147f36062913981565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146125fe576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361260a82826140e0565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c579190613a23565b60025473ffffffffffffffffffffffffffffffffffffffff16331461268b576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835f8190036126c6576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612702576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270d6024426142a6565b8467ffffffffffffffff161115612750576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156127b5575f80fd5b505af11580156127c7573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635ca1e1656040518163ffffffff1660e01b8152600401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190613f53565b60075460055491925068010000000000000000900467ffffffffffffffff1690815f5b85811015612b77575f8b8b83818110612897576128976142b9565b90506020028101906128a991906142e6565b6128b290614322565b8051805160209091012060408201519192509067ffffffffffffffff1615612a9257856128de816143a8565b9650505f818360200151846040015185606001516040516020016129409493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f908152600690935291205490915081146129c8576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612b62565b8151516201d4c01015612ad1576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612b6f906143ce565b91505061287c565b5060075467ffffffffffffffff9081169084161115612bc2576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614612c77575f612be78386613f97565b9050612bfd67ffffffffffffffff821683614067565b9150612c367f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16611f4c6107f2565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612d73337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2a9190613f53565b612d349190614405565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906136de565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612e0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e339190614080565b9050612e3f8782613f97565b67ffffffffffffffff168967ffffffffffffffff1614612e8b576040517f1a070d9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051612ec791815260200190565b60405180910390a2505050505050505050505050565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590612f1b575073ffffffffffffffffffffffffffffffffffffffff81163314155b15612f52576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fdf9190614048565b15613016576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015613080573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a49190613f53565b9050828111156130e0576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138884111561311c576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61315e73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846136de565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ec9190613f53565b6007805491925067ffffffffffffffff909116905f61320a836143a8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505085856040516132419291906146b8565b6040519081900390208142613257600143614067565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f908152600690935291205532330361334d576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a26111ea565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319061339390849033908b908b906146c7565b60405180910390a2505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613600576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa15801561344a573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261348f9190810190614737565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613521573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061354591906147a9565b915091508163ffffffff165f146135bc576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff8416171790556135fd565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526136d99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613742565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261373c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613657565b50505050565b5f6137a3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661384d9092919063ffffffff16565b8051909150156136d957808060200190518101906137c19190614048565b6136d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9d565b60606124bb84845f85855f808673ffffffffffffffffffffffffffffffffffffffff16858760405161387f91906147e1565b5f6040518083038185875af1925050503d805f81146138b9576040519150601f19603f3d011682016040523d82523d5f602084013e6138be565b606091505b50915091506138cf878383876138da565b979650505050505050565b6060831561396f5782515f036139685773ffffffffffffffffffffffffffffffffffffffff85163b613968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9d565b50816124bb565b6124bb83838151156139845781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d9190613a23565b5f5b838110156139d25781810151838201526020016139ba565b50505f910152565b5f81518084526139f18160208601602086016139b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613a3560208301846139da565b9392505050565b67ffffffffffffffff81168114613a51575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613a51575f80fd5b5f805f60608486031215613a87575f80fd5b8335613a9281613a3c565b9250602084013591506040840135613aa981613a54565b809150509250925092565b5f60208284031215613ac4575f80fd5b8135613a3581613a3c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b4357613b43613acf565b604052919050565b5f67ffffffffffffffff821115613b6457613b64613acf565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613b9f575f80fd5b8135613bb2613bad82613b4b565b613afc565b818152846020838601011115613bc6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613bf6575f80fd5b8535613c0181613a54565b94506020860135613c1181613a54565b9350604086013567ffffffffffffffff80821115613c2d575f80fd5b613c3989838a01613b90565b94506060880135915080821115613c4e575f80fd5b50613c5b88828901613b90565b95989497509295608001359392505050565b5f60208284031215613c7d575f80fd5b8135613a3581613a54565b63ffffffff81168114613a51575f80fd5b5f805f805f8060c08789031215613cae575f80fd5b8635613cb981613a54565b95506020870135613cc981613a54565b94506040870135613cd981613c88565b93506060870135613ce981613a54565b9250608087013567ffffffffffffffff80821115613d05575f80fd5b613d118a838b01613b90565b935060a0890135915080821115613d26575f80fd5b50613d3389828a01613b90565b9150509295509295509295565b5f8083601f840112613d50575f80fd5b50813567ffffffffffffffff811115613d67575f80fd5b6020830191508360208260051b8501011115613d81575f80fd5b9250929050565b5f8060208385031215613d99575f80fd5b823567ffffffffffffffff811115613daf575f80fd5b613dbb85828601613d40565b90969095509350505050565b5f805f8060808587031215613dda575f80fd5b8435613de581613c88565b93506020850135613df581613a54565b92506040850135613e0581613c88565b9150606085013567ffffffffffffffff811115613e20575f80fd5b613e2c87828801613b90565b91505092959194509250565b5f60208284031215613e48575f80fd5b813567ffffffffffffffff811115613e5e575f80fd5b6124bb84828501613b90565b5f805f805f60808688031215613e7e575f80fd5b853567ffffffffffffffff811115613e94575f80fd5b613ea088828901613d40565b9096509450506020860135613eb481613a3c565b92506040860135613ec481613a3c565b91506060860135613ed481613a54565b809150509295509295909350565b5f805f60408486031215613ef4575f80fd5b833567ffffffffffffffff80821115613f0b575f80fd5b818601915086601f830112613f1e575f80fd5b813581811115613f2c575f80fd5b876020828501011115613f3d575f80fd5b6020928301989097509590910135949350505050565b5f60208284031215613f63575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115613fb857613fb8613f6a565b5092915050565b5f82613ff2577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061400b57607f821691505b602082108103614042577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215614058575f80fd5b81518015158114613a35575f80fd5b8181038181111561407a5761407a613f6a565b92915050565b5f60208284031215614090575f80fd5b8151613a3581613a3c565b601f8211156136d9575f81815260208120601f850160051c810160208610156140c15750805b601f850160051c820191505b818110156111ea578281556001016140cd565b815167ffffffffffffffff8111156140fa576140fa613acf565b61410e816141088454613ff7565b8461409b565b602080601f831160018114614160575f841561412a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556111ea565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156141ac5788860151825594840194600190910190840161418d565b50858210156141e857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f61421a60808301866139da565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b606081525f61425960608301866139da565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115613fb857613fb8613f6a565b8082018082111561407a5761407a613f6a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614318575f80fd5b9190910192915050565b5f60808236031215614332575f80fd5b6040516080810167ffffffffffffffff828210818311171561435657614356613acf565b81604052843591508082111561436a575f80fd5b5061437736828601613b90565b82525060208301356020820152604083013561439281613a3c565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff8083168181036143c4576143c4613f6a565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143fe576143fe613f6a565b5060010190565b808202811582820484141761407a5761407a613f6a565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a083015261447260c08301846139da565b98975050505050505050565b61ffff818116838216019080821115613fb857613fb8613f6a565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614501816003860160208c016139b8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614544816017840160208b016139b8565b808201915050818660f81b1660178201528451915061456a8260188301602088016139b8565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b16600184015287516145e3816003860160208c016139b8565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b1660038201528651614626816017840160208b016139b8565b808201915050818660f01b1660178201528451915061464c8260198301602088016139b8565b016019019998505050505050505050565b5f865161466e818460208b016139b8565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f60208284031215614747575f80fd5b815167ffffffffffffffff81111561475d575f80fd5b8201601f8101841361476d575f80fd5b805161477b613bad82613b4b565b81815285602083850101111561478f575f80fd5b6147a08260208301602086016139b8565b95945050505050565b5f80604083850312156147ba575f80fd5b82516147c581613c88565b60208401519092506147d681613a54565b809150509250929050565b5f82516143188184602087016139b856fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212205f7eb0c1f6419540d705e6d0820952b7eada1c659c98f5a2aaf1e215cc716ea064736f6c63430008140033",
+ "bytecode": "0x61010060405234801562000011575f80fd5b5060405162004c8438038062004c8483398101604081905262000034916200014e565b6001600160a01b0380851660a05280841660805280831660c052811660e05283838383838383836200006562000077565b505050505050505050505050620001b3565b5f54610100900460ff1615620000e35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116101562000134575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014b575f80fd5b50565b5f805f806080858703121562000162575f80fd5b84516200016f8162000136565b6020860151909450620001828162000136565b6040860151909350620001958162000136565b6060860151909250620001a88162000136565b939692955090935050565b60805160a05160c05160e0516149d2620002b25f395f8181610512015281816109a401528181610b1001528181610c8f01528181610fd901528181611212015281816113920152818161170f01528181611baa01528181611ff9015281816120ee01528181612ca401528181612d1d01528181612d3f01528181612e540152818161306a015261312f01525f8181610691015281816122b8015281816123c0015281816127950152818161351c01526135f101525f818161076801528181610e4e0152818161158601528181612843015261327701525f818161079a015281816108570152818161204201528181612deb015261324c01526149d25ff3fe608060405234801561000f575f80fd5b50600436106102f8575f3560e01c80637125702211610192578063b910e0f9116100e8578063d7bc90ff11610093578063eaeb077b1161006e578063eaeb077b146107d0578063f35dda47146107e3578063f851a440146107eb575f80fd5b8063d7bc90ff1461078a578063e46761c414610795578063e7a7ed02146107bc575f80fd5b8063c89e42df116100c3578063c89e42df14610730578063cfa8ed4714610743578063d02103ca14610763575f80fd5b8063b910e0f9146106ed578063c754c7ed14610700578063c7fffd4b14610728575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f919146106c6578063af7f3e02146106d9578063b0afe154146106e1575f80fd5b80639f26f84014610679578063a3c573eb1461068c578063a652f26c146106b3575f80fd5b80638c3d7301116101785780638c3d73011461064357806391cafe321461064b5780639e0018771461065e575f80fd5b806371257022146105f45780637a5460c514610607575f80fd5b806342308fab116102525780635d6717a5116101fd5780636b8616ce116101d85780636b8616ce146105b95780636e05d2cd146105d85780636ff512cc146105e1575f80fd5b80635d6717a51461058b578063669adece1461059e578063676870d2146105b1575f80fd5b80634e4877061161022d5780634e4877061461053457806352bdeb6d14610547578063542028d514610583575f80fd5b806342308fab146104cc57806345605267146104d457806349b7b8021461050d575f80fd5b806326782247116102b25780633c351e101161028d5780633c351e10146104175780633cbc795b1461043757806340b5de6c14610474575f80fd5b8063267822471461039d5780632c111c06146103e257806332c2d15314610402575f80fd5b806305835f37116102e257806305835f3714610332578063107bf28c1461037b57806311e892d414610383575f80fd5b8062d0295d146102fc5780630350896314610317575b5f80fd5b610304610810565b6040519081526020015b60405180910390f35b61031f602081565b60405161ffff909116815260200161030e565b61036e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030e9190613b39565b61036e610916565b61038b60f981565b60405160ff909116815260200161030e565b6001546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030e565b6008546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b610415610410366004613b8b565b6109a2565b005b6009546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030e565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030e565b610304602481565b6007546104f49068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030e565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b610415610542366004613bca565b610a71565b61036e6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036e610c80565b610415610599366004613cf8565b610c8d565b6104156105ac366004613d83565b611210565b61031f601f81565b6103046105c7366004613bca565b60066020525f908152604090205481565b61030460055481565b6104156105ef366004613dad565b6112c7565b610415610602366004613dd9565b611390565b61036e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610415611944565b610415610659366004613dad565b611a16565b6103bd73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610415610687366004613ec8565b611b2e565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b61036e6106c1366004613f07565b6121ba565b6104156106d4366004613dad565b612598565b61036e612661565b6103046405ca1ab1e081565b6104156106fb366004613f78565b61267d565b6007546104f490700100000000000000000000000000000000900467ffffffffffffffff1681565b61038b60e481565b61041561073e366004613ff8565b612f61565b6002546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b610304635ca1ab1e81565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104f49067ffffffffffffffff1681565b6104156107de36600461402a565b612ff3565b61038b601b81565b5f546103bd9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561089c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c0919061409b565b6007549091505f906108ea9067ffffffffffffffff680100000000000000008204811691166140df565b67ffffffffffffffff169050805f03610905575f9250505090565b61090f8183614107565b9250505090565b600480546109239061413f565b80601f016020809104026020016040519081016040528092919081815260200182805461094f9061413f565b801561099a5780601f106109715761010080835404028352916020019161099a565b820191905f5260205f20905b81548152906001019060200180831161097d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a11576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6491815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b0e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9b9190614190565b610bfc5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bfc576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109239061413f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cfc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d1a57505f54600160ff909116105b80610d335750303b158015610d3357505f5460ff166001145b610dc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e20575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a001604052806062815260200161493b6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed9919061409b565b90505f868483858d610eec6001436141af565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611034573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105891906141c8565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110e99190614228565b5060046110f68a82614228565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111989493929190614340565b60405180910390a15050505050508015611208575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461127f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461131d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c75565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146113ff576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561141d57505f54600160ff909116105b806114365750303b15801561143657505f5460ff166001145b6114c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dbb565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561151e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611528856134b9565b6009549091505f9061157290889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856121ba565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611611919061409b565b90505f808483858f6116246001436141af565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af115801561176a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178e91906141c8565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161181e9190614228565b50600461182b8982614228565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516118cb9392919061438f565b60405180910390a1505050505050801561193b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611995576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611abb576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c75565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611b6c575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611ba3576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3591906141c8565b611c3f91906143cd565b67ffffffffffffffff161115611c81576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611cbc576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611d20918491680100000000000000009004166143ee565b1115611d58576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611ff3575f878783818110611d9357611d93614401565b9050602002810190611da5919061442e565b611dae9061446a565b905083611dba816144f0565b825180516020918201208185015160408087015160608801519151959a509295505f94611e26948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611eae576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611ed26001886141af565b8403611f415742600760109054906101000a900467ffffffffffffffff168460400151611eff91906143cd565b67ffffffffffffffff161115611f41576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611feb90614516565b915050611d78565b506120697f000000000000000000000000000000000000000000000000000000000000000084612021610810565b61202b919061454d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061371b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e739061213a908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217a91906141c8565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016121ec96959493929190614564565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f0361233c5760f9601f835161228091906145c6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161232697969594939291906145e1565b6040516020818303038152906040529050612440565b815161ffff1015612379576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96123886020836145c6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161242d97969594939291906146c3565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561249e573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612516576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f9061255b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016147a5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146125ee576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c75565b6040518060a001604052806062815260200161493b6062913981565b60025473ffffffffffffffffffffffffffffffffffffffff1633146126ce576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f819003612709576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612745576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127506024426143ee565b8467ffffffffffffffff161115612793576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156127f8575f80fd5b505af115801561280a573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa15801561289e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c2919061409b565b9050806128fb576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015612c17575f8c8c8381811061293757612937614401565b9050602002810190612949919061442e565b6129529061446a565b8051805160209091012060408201519192509067ffffffffffffffff1615612b32578561297e816144f0565b9650505f818360200151846040015185606001516040516020016129e09493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c02565b8151516201d4c01015612b71576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c0f90614516565b91505061291c565b5060075467ffffffffffffffff9081169084161115612c62576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614612d17575f612c8783866140df565b9050612c9d67ffffffffffffffff8216836141af565b9150612cd67f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612021610810565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e13337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dca919061409b565b612dd4919061454d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906137f4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed391906141c8565b9050888414612f0e576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051612f4a91815260200190565b60405180910390a250505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612fb7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612fc38282614228565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c759190613b39565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590613031575073ffffffffffffffffffffffffffffffffffffffff81163314155b15613068576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f59190614190565b1561312c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015613196573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ba919061409b565b9050828111156131f6576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115613232576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61327473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846137f4565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613302919061409b565b6007805491925067ffffffffffffffff909116905f613320836144f0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613357929190614800565b604051908190039020814261336d6001436141af565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613463576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2611208565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906134a990849033908b908b9061480f565b60405180910390a2505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613716576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613560573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526135a5919081019061487f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061365b91906148f1565b915091508163ffffffff165f146136d2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613713565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526137ef9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613858565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526138529085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161376d565b50505050565b5f6138b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139639092919063ffffffff16565b8051909150156137ef57808060200190518101906138d79190614190565b6137ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dbb565b606061259084845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516139959190614929565b5f6040518083038185875af1925050503d805f81146139cf576040519150601f19603f3d011682016040523d82523d5f602084013e6139d4565b606091505b50915091506139e5878383876139f0565b979650505050505050565b60608315613a855782515f03613a7e5773ffffffffffffffffffffffffffffffffffffffff85163b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dbb565b5081612590565b6125908383815115613a9a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9190613b39565b5f5b83811015613ae8578181015183820152602001613ad0565b50505f910152565b5f8151808452613b07816020860160208601613ace565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613b4b6020830184613af0565b9392505050565b67ffffffffffffffff81168114613b67575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613b67575f80fd5b5f805f60608486031215613b9d575f80fd5b8335613ba881613b52565b9250602084013591506040840135613bbf81613b6a565b809150509250925092565b5f60208284031215613bda575f80fd5b8135613b4b81613b52565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c5957613c59613be5565b604052919050565b5f67ffffffffffffffff821115613c7a57613c7a613be5565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613cb5575f80fd5b8135613cc8613cc382613c61565b613c12565b818152846020838601011115613cdc575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613d0c575f80fd5b8535613d1781613b6a565b94506020860135613d2781613b6a565b9350604086013567ffffffffffffffff80821115613d43575f80fd5b613d4f89838a01613ca6565b94506060880135915080821115613d64575f80fd5b50613d7188828901613ca6565b95989497509295608001359392505050565b5f8060408385031215613d94575f80fd5b8235613d9f81613b52565b946020939093013593505050565b5f60208284031215613dbd575f80fd5b8135613b4b81613b6a565b63ffffffff81168114613b67575f80fd5b5f805f805f8060c08789031215613dee575f80fd5b8635613df981613b6a565b95506020870135613e0981613b6a565b94506040870135613e1981613dc8565b93506060870135613e2981613b6a565b9250608087013567ffffffffffffffff80821115613e45575f80fd5b613e518a838b01613ca6565b935060a0890135915080821115613e66575f80fd5b50613e7389828a01613ca6565b9150509295509295509295565b5f8083601f840112613e90575f80fd5b50813567ffffffffffffffff811115613ea7575f80fd5b6020830191508360208260051b8501011115613ec1575f80fd5b9250929050565b5f8060208385031215613ed9575f80fd5b823567ffffffffffffffff811115613eef575f80fd5b613efb85828601613e80565b90969095509350505050565b5f805f8060808587031215613f1a575f80fd5b8435613f2581613dc8565b93506020850135613f3581613b6a565b92506040850135613f4581613dc8565b9150606085013567ffffffffffffffff811115613f60575f80fd5b613f6c87828801613ca6565b91505092959194509250565b5f805f805f8060a08789031215613f8d575f80fd5b863567ffffffffffffffff811115613fa3575f80fd5b613faf89828a01613e80565b9097509550506020870135613fc381613dc8565b93506040870135613fd381613b52565b9250606087013591506080870135613fea81613b6a565b809150509295509295509295565b5f60208284031215614008575f80fd5b813567ffffffffffffffff81111561401e575f80fd5b61259084828501613ca6565b5f805f6040848603121561403c575f80fd5b833567ffffffffffffffff80821115614053575f80fd5b818601915086601f830112614066575f80fd5b813581811115614074575f80fd5b876020828501011115614085575f80fd5b6020928301989097509590910135949350505050565b5f602082840312156140ab575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115614100576141006140b2565b5092915050565b5f8261413a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061415357607f821691505b60208210810361418a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f602082840312156141a0575f80fd5b81518015158114613b4b575f80fd5b818103818111156141c2576141c26140b2565b92915050565b5f602082840312156141d8575f80fd5b8151613b4b81613b52565b601f8211156137ef575f81815260208120601f850160051c810160208610156142095750805b601f850160051c820191505b8181101561120857828155600101614215565b815167ffffffffffffffff81111561424257614242613be5565b61425681614250845461413f565b846141e3565b602080601f8311600181146142a8575f84156142725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611208565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f4578886015182559484019460019091019084016142d5565b508582101561433057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6143626080830186613af0565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b606081525f6143a16060830186613af0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115614100576141006140b2565b808201808211156141c2576141c26140b2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614460575f80fd5b9190910192915050565b5f6080823603121561447a575f80fd5b6040516080810167ffffffffffffffff828210818311171561449e5761449e613be5565b8160405284359150808211156144b2575f80fd5b506144bf36828601613ca6565b8252506020830135602082015260408301356144da81613b52565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361450c5761450c6140b2565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614546576145466140b2565b5060010190565b80820281158282048414176141c2576141c26140b2565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526145ba60c0830184613af0565b98975050505050505050565b61ffff818116838216019080821115614100576141006140b2565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614649816003860160208c01613ace565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468c816017840160208b01613ace565b808201915050818660f81b166017820152845191506146b2826018830160208801613ace565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161472b816003860160208c01613ace565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161476e816017840160208b01613ace565b808201915050818660f01b16601782015284519150614794826019830160208801613ace565b016019019998505050505050505050565b5f86516147b6818460208b01613ace565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f6020828403121561488f575f80fd5b815167ffffffffffffffff8111156148a5575f80fd5b8201601f810184136148b5575f80fd5b80516148c3613cc382613c61565b8181528560208385010111156148d7575f80fd5b6148e8826020830160208601613ace565b95945050505050565b5f8060408385031215614902575f80fd5b825161490d81613dc8565b602084015190925061491e81613b6a565b809150509250929050565b5f8251614460818460208701613ace56fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212207856dfc85aae7e627fea5f616cb0ac92c48b5b310deb4f096e99c1918acf281b64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102f8575f3560e01c80637125702211610192578063b910e0f9116100e8578063d7bc90ff11610093578063eaeb077b1161006e578063eaeb077b146107d0578063f35dda47146107e3578063f851a440146107eb575f80fd5b8063d7bc90ff1461078a578063e46761c414610795578063e7a7ed02146107bc575f80fd5b8063c89e42df116100c3578063c89e42df14610730578063cfa8ed4714610743578063d02103ca14610763575f80fd5b8063b910e0f9146106ed578063c754c7ed14610700578063c7fffd4b14610728575f80fd5b80639f26f84011610148578063ada8f91911610123578063ada8f919146106c6578063af7f3e02146106d9578063b0afe154146106e1575f80fd5b80639f26f84014610679578063a3c573eb1461068c578063a652f26c146106b3575f80fd5b80638c3d7301116101785780638c3d73011461064357806391cafe321461064b5780639e0018771461065e575f80fd5b806371257022146105f45780637a5460c514610607575f80fd5b806342308fab116102525780635d6717a5116101fd5780636b8616ce116101d85780636b8616ce146105b95780636e05d2cd146105d85780636ff512cc146105e1575f80fd5b80635d6717a51461058b578063669adece1461059e578063676870d2146105b1575f80fd5b80634e4877061161022d5780634e4877061461053457806352bdeb6d14610547578063542028d514610583575f80fd5b806342308fab146104cc57806345605267146104d457806349b7b8021461050d575f80fd5b806326782247116102b25780633c351e101161028d5780633c351e10146104175780633cbc795b1461043757806340b5de6c14610474575f80fd5b8063267822471461039d5780632c111c06146103e257806332c2d15314610402575f80fd5b806305835f37116102e257806305835f3714610332578063107bf28c1461037b57806311e892d414610383575f80fd5b8062d0295d146102fc5780630350896314610317575b5f80fd5b610304610810565b6040519081526020015b60405180910390f35b61031f602081565b60405161ffff909116815260200161030e565b61036e6040518060400160405280600881526020017f80808401c9c3809400000000000000000000000000000000000000000000000081525081565b60405161030e9190613b39565b61036e610916565b61038b60f981565b60405160ff909116815260200161030e565b6001546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030e565b6008546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b610415610410366004613b8b565b6109a2565b005b6009546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b60095461045f9074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff909116815260200161030e565b61049b7fff0000000000000000000000000000000000000000000000000000000000000081565b6040517fff00000000000000000000000000000000000000000000000000000000000000909116815260200161030e565b610304602481565b6007546104f49068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030e565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b610415610542366004613bca565b610a71565b61036e6040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525081565b61036e610c80565b610415610599366004613cf8565b610c8d565b6104156105ac366004613d83565b611210565b61031f601f81565b6103046105c7366004613bca565b60066020525f908152604090205481565b61030460055481565b6104156105ef366004613dad565b6112c7565b610415610602366004613dd9565b611390565b61036e6040518060400160405280600281526020017f80b900000000000000000000000000000000000000000000000000000000000081525081565b610415611944565b610415610659366004613dad565b611a16565b6103bd73a40d5f56745a118d0906a34e69aec8c0db1cb8fa81565b610415610687366004613ec8565b611b2e565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b61036e6106c1366004613f07565b6121ba565b6104156106d4366004613dad565b612598565b61036e612661565b6103046405ca1ab1e081565b6104156106fb366004613f78565b61267d565b6007546104f490700100000000000000000000000000000000900467ffffffffffffffff1681565b61038b60e481565b61041561073e366004613ff8565b612f61565b6002546103bd9073ffffffffffffffffffffffffffffffffffffffff1681565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b610304635ca1ab1e81565b6103bd7f000000000000000000000000000000000000000000000000000000000000000081565b6007546104f49067ffffffffffffffff1681565b6104156107de36600461402a565b612ff3565b61038b601b81565b5f546103bd9062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561089c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c0919061409b565b6007549091505f906108ea9067ffffffffffffffff680100000000000000008204811691166140df565b67ffffffffffffffff169050805f03610905575f9250505090565b61090f8183614107565b9250505090565b600480546109239061413f565b80601f016020809104026020016040519081016040528092919081815260200182805461094f9061413f565b801561099a5780601f106109715761010080835404028352916020019161099a565b820191905f5260205f20905b81548152906001019060200180831161097d57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a11576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168367ffffffffffffffff167f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596684604051610a6491815260200190565b60405180910390a3505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115610b0e576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9b9190614190565b610bfc5760075467ffffffffffffffff700100000000000000000000000000000000909104811690821610610bfc576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020015b60405180910390a150565b600380546109239061413f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610cfc576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff1615808015610d1a57505f54600160ff909116105b80610d335750303b158015610d3357505f5460ff166001145b610dc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e20575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6040518060a001604052806062815260200161493b6062913990505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed9919061409b565b90505f868483858d610eec6001436141af565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291505f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015611034573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105891906141c8565b90508b5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555089600390816110e99190614228565b5060046110f68a82614228565b508b60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd2c80353fc15ef62c6affc7cd6b7ab5b42c43290c50be3372e55ae552cecd19c8187858e6040516111989493929190614340565b60405180910390a15050505050508015611208575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461127f576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600581905560405181815267ffffffffffffffff8316907f1125aaf62d132d8e2d02005114f8fc360ff204c3105e4f1a700a1340dc55d5b19060200160405180910390a25050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff16331461131d576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc090602001610c75565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146113ff576040517fb9b3a2c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f54610100900460ff161580801561141d57505f54600160ff909116105b806114365750303b15801561143657505f5460ff166001145b6114c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610dbb565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561151e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f611528856134b9565b6009549091505f9061157290889073ffffffffffffffffffffffffffffffffffffffff81169074010000000000000000000000000000000000000000900463ffffffff16856121ba565b90505f818051906020012090505f4290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611611919061409b565b90505f808483858f6116246001436141af565b60408051602081019790975286019490945260608086019390935260c09190911b7fffffffffffffffff000000000000000000000000000000000000000000000000166080850152901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608883015240609c82015260bc01604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815290829052805160209091012060058190557f9a908e73000000000000000000000000000000000000000000000000000000008252600160048301526024820181905291507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af115801561176a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178e91906141c8565b508c5f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b60025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550886003908161181e9190614228565b50600461182b8982614228565b508c60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062069780600760106101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f060116213bcbf54ca19fd649dc84b59ab2bbd200ab199770e4d923e222a28e7f85838e6040516118cb9392919061438f565b60405180910390a1505050505050801561193b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611995576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001545f80547fffffffffffffffffffff0000000000000000000000000000000000000000ffff1673ffffffffffffffffffffffffffffffffffffffff9092166201000081029290921790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314611a6c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff16611abb576040517fc89374d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f5fbd7dd171301c4a1611a84aac4ba86d119478560557755f7927595b082634fb90602001610c75565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590611b6c575073ffffffffffffffffffffffffffffffffffffffff81163314155b15611ba3576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4262093a807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166330c27dde6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3591906141c8565b611c3f91906143cd565b67ffffffffffffffff161115611c81576040517f3d49ed4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f819003611cbc576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115611cf8576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075467ffffffffffffffff80821691611d20918491680100000000000000009004166143ee565b1115611d58576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff16905f5b83811015611ff3575f878783818110611d9357611d93614401565b9050602002810190611da5919061442e565b611dae9061446a565b905083611dba816144f0565b825180516020918201208185015160408087015160608801519151959a509295505f94611e26948794929101938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f90815260069093529120549091508114611eae576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f90815260066020526040812055611ed26001886141af565b8403611f415742600760109054906101000a900467ffffffffffffffff168460400151611eff91906143cd565b67ffffffffffffffff161115611f41576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018b90529285018790528481019390935260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808401523390911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc016040516020818303038152906040528051906020012094505050508080611feb90614516565b915050611d78565b506120697f000000000000000000000000000000000000000000000000000000000000000084612021610810565b61202b919061454d565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016919061371b565b60058190556007805467ffffffffffffffff841668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff9091161790556040517f9a908e730000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a908e739061213a908790869060040167ffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015612156573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217a91906141c8565b60405190915067ffffffffffffffff8216907f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a4905f90a250505050505050565b60605f85858573a40d5f56745a118d0906a34e69aec8c0db1cb8fa5f876040516024016121ec96959493929190614564565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff811bff70000000000000000000000000000000000000000000000000000000017905283519091506060905f0361233c5760f9601f835161228091906145c6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b800000000000000000000000000000000000000000000000000000000000081525060e48760405160200161232697969594939291906145e1565b6040516020818303038152906040529050612440565b815161ffff1015612379576040517f248b8f8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160f96123886020836145c6565b6040518060400160405280600881526020017f80808401c9c380940000000000000000000000000000000000000000000000008152507f00000000000000000000000000000000000000000000000000000000000000006040518060400160405280600281526020017f80b9000000000000000000000000000000000000000000000000000000000000815250858860405160200161242d97969594939291906146c3565b6040516020818303038152906040529150505b8051602080830191909120604080515f80825293810180835292909252601b908201526405ca1ab1e06060820152635ca1ab1e608082015260019060a0016020604051602081039080840390855afa15801561249e573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116612516576040517fcd16196600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f9061255b9084906405ca1ab1e090635ca1ab1e90601b907fff00000000000000000000000000000000000000000000000000000000000000906020016147a5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529450505050505b949350505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff1633146125ee576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce690602001610c75565b6040518060a001604052806062815260200161493b6062913981565b60025473ffffffffffffffffffffffffffffffffffffffff1633146126ce576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f819003612709576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8811115612745576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127506024426143ee565b8467ffffffffffffffff161115612793576040517f0a00feb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156127f8575f80fd5b505af115801561280a573d5f803e3d5ffd5b50506040517fef4eeb3500000000000000000000000000000000000000000000000000000000815263ffffffff881660048201525f92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063ef4eeb3590602401602060405180830381865afa15801561289e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c2919061409b565b9050806128fb576040517fa60721e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546005546801000000000000000090910467ffffffffffffffff1690815f5b85811015612c17575f8c8c8381811061293757612937614401565b9050602002810190612949919061442e565b6129529061446a565b8051805160209091012060408201519192509067ffffffffffffffff1615612b32578561297e816144f0565b9650505f818360200151846040015185606001516040516020016129e09493929190938452602084019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166040830152604882015260680190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260069093529120549091508114612a68576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208381015160408086015160608088015183519586018c90529285018790528481019390935260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166080840152908c901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088830152609c82015260bc0160405160208183030381529060405280519060200120955060065f8867ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205f905550612c02565b8151516201d4c01015612b71576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160208101879052908101829052606080820189905260c08d901b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528a901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888201525f609c82015260bc016040516020818303038152906040528051906020012094505b50508080612c0f90614516565b91505061291c565b5060075467ffffffffffffffff9081169084161115612c62576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290558467ffffffffffffffff84811690831614612d17575f612c8783866140df565b9050612c9d67ffffffffffffffff8216836141af565b9150612cd67f00000000000000000000000000000000000000000000000000000000000000008267ffffffffffffffff16612021610810565b50600780547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff8716021790555b612e13337f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663477fa2706040518163ffffffff1660e01b8152600401602060405180830381865afa158015612da6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dca919061409b565b612dd4919061454d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169291906137f4565b6040517f9a908e7300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff87166004820152602481018490525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a908e73906044016020604051808303815f875af1158015612eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed391906141c8565b9050888414612f0e576040517fda5bceb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff167f3e54d0825ed78523037d00a81759237eb436ce774bd546993ee67a1b67b6e76687604051612f4a91815260200190565b60405180910390a250505050505050505050505050565b5f5462010000900473ffffffffffffffffffffffffffffffffffffffff163314612fb7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003612fc38282614228565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b2081604051610c759190613b39565b60085473ffffffffffffffffffffffffffffffffffffffff168015801590613031575073ffffffffffffffffffffffffffffffffffffffff81163314155b15613068576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f59190614190565b1561312c576040517f39258d1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663604691696040518163ffffffff1660e01b8152600401602060405180830381865afa158015613196573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131ba919061409b565b9050828111156131f6576040517f2354600f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388841115613232576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61327473ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846137f4565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613302919061409b565b6007805491925067ffffffffffffffff909116905f613320836144f0565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508585604051613357929190614800565b604051908190039020814261336d6001436141af565b60408051602081019590955284019290925260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166060830152406068820152608801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060075467ffffffffffffffff165f9081526006909352912055323303613463576007546040805183815233602082015260608183018190525f90820152905167ffffffffffffffff909216917ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319181900360800190a2611208565b60075460405167ffffffffffffffff909116907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931906134a990849033908b908b9061480f565b60405180910390a2505050505050565b606073ffffffffffffffffffffffffffffffffffffffff821615613716576040517fc00f14ab00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c00f14ab906024015f60405180830381865afa158015613560573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526135a5919081019061487f565b6040517f318aee3d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529192505f9182917f00000000000000000000000000000000000000000000000000000000000000009091169063318aee3d906024016040805180830381865afa158015613637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061365b91906148f1565b915091508163ffffffff165f146136d2576009805463ffffffff841674010000000000000000000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090911673ffffffffffffffffffffffffffffffffffffffff841617179055613713565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b50505b919050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526137ef9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613858565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526138529085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161376d565b50505050565b5f6138b9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139639092919063ffffffff16565b8051909150156137ef57808060200190518101906138d79190614190565b6137ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610dbb565b606061259084845f85855f808673ffffffffffffffffffffffffffffffffffffffff1685876040516139959190614929565b5f6040518083038185875af1925050503d805f81146139cf576040519150601f19603f3d011682016040523d82523d5f602084013e6139d4565b606091505b50915091506139e5878383876139f0565b979650505050505050565b60608315613a855782515f03613a7e5773ffffffffffffffffffffffffffffffffffffffff85163b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dbb565b5081612590565b6125908383815115613a9a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb9190613b39565b5f5b83811015613ae8578181015183820152602001613ad0565b50505f910152565b5f8151808452613b07816020860160208601613ace565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f613b4b6020830184613af0565b9392505050565b67ffffffffffffffff81168114613b67575f80fd5b50565b73ffffffffffffffffffffffffffffffffffffffff81168114613b67575f80fd5b5f805f60608486031215613b9d575f80fd5b8335613ba881613b52565b9250602084013591506040840135613bbf81613b6a565b809150509250925092565b5f60208284031215613bda575f80fd5b8135613b4b81613b52565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613c5957613c59613be5565b604052919050565b5f67ffffffffffffffff821115613c7a57613c7a613be5565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112613cb5575f80fd5b8135613cc8613cc382613c61565b613c12565b818152846020838601011115613cdc575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613d0c575f80fd5b8535613d1781613b6a565b94506020860135613d2781613b6a565b9350604086013567ffffffffffffffff80821115613d43575f80fd5b613d4f89838a01613ca6565b94506060880135915080821115613d64575f80fd5b50613d7188828901613ca6565b95989497509295608001359392505050565b5f8060408385031215613d94575f80fd5b8235613d9f81613b52565b946020939093013593505050565b5f60208284031215613dbd575f80fd5b8135613b4b81613b6a565b63ffffffff81168114613b67575f80fd5b5f805f805f8060c08789031215613dee575f80fd5b8635613df981613b6a565b95506020870135613e0981613b6a565b94506040870135613e1981613dc8565b93506060870135613e2981613b6a565b9250608087013567ffffffffffffffff80821115613e45575f80fd5b613e518a838b01613ca6565b935060a0890135915080821115613e66575f80fd5b50613e7389828a01613ca6565b9150509295509295509295565b5f8083601f840112613e90575f80fd5b50813567ffffffffffffffff811115613ea7575f80fd5b6020830191508360208260051b8501011115613ec1575f80fd5b9250929050565b5f8060208385031215613ed9575f80fd5b823567ffffffffffffffff811115613eef575f80fd5b613efb85828601613e80565b90969095509350505050565b5f805f8060808587031215613f1a575f80fd5b8435613f2581613dc8565b93506020850135613f3581613b6a565b92506040850135613f4581613dc8565b9150606085013567ffffffffffffffff811115613f60575f80fd5b613f6c87828801613ca6565b91505092959194509250565b5f805f805f8060a08789031215613f8d575f80fd5b863567ffffffffffffffff811115613fa3575f80fd5b613faf89828a01613e80565b9097509550506020870135613fc381613dc8565b93506040870135613fd381613b52565b9250606087013591506080870135613fea81613b6a565b809150509295509295509295565b5f60208284031215614008575f80fd5b813567ffffffffffffffff81111561401e575f80fd5b61259084828501613ca6565b5f805f6040848603121561403c575f80fd5b833567ffffffffffffffff80821115614053575f80fd5b818601915086601f830112614066575f80fd5b813581811115614074575f80fd5b876020828501011115614085575f80fd5b6020928301989097509590910135949350505050565b5f602082840312156140ab575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff828116828216039080821115614100576141006140b2565b5092915050565b5f8261413a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b600181811c9082168061415357607f821691505b60208210810361418a577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f602082840312156141a0575f80fd5b81518015158114613b4b575f80fd5b818103818111156141c2576141c26140b2565b92915050565b5f602082840312156141d8575f80fd5b8151613b4b81613b52565b601f8211156137ef575f81815260208120601f850160051c810160208610156142095750805b601f850160051c820191505b8181101561120857828155600101614215565b815167ffffffffffffffff81111561424257614242613be5565b61425681614250845461413f565b846141e3565b602080601f8311600181146142a8575f84156142725750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611208565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156142f4578886015182559484019460019091019084016142d5565b508582101561433057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff85168152608060208201525f6143626080830186613af0565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b606081525f6143a16060830186613af0565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b67ffffffffffffffff818116838216019080821115614100576141006140b2565b808201808211156141c2576141c26140b2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614460575f80fd5b9190910192915050565b5f6080823603121561447a575f80fd5b6040516080810167ffffffffffffffff828210818311171561449e5761449e613be5565b8160405284359150808211156144b2575f80fd5b506144bf36828601613ca6565b8252506020830135602082015260408301356144da81613b52565b6040820152606092830135928101929092525090565b5f67ffffffffffffffff80831681810361450c5761450c6140b2565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614546576145466140b2565b5060010190565b80820281158282048414176141c2576141c26140b2565b5f63ffffffff808916835273ffffffffffffffffffffffffffffffffffffffff8089166020850152818816604085015280871660608501528086166080850152505060c060a08301526145ba60c0830184613af0565b98975050505050505050565b61ffff818116838216019080821115614100576141006140b2565b5f7fff00000000000000000000000000000000000000000000000000000000000000808a60f81b1683527fffff0000000000000000000000000000000000000000000000000000000000008960f01b1660018401528751614649816003860160208c01613ace565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161468c816017840160208b01613ace565b808201915050818660f81b166017820152845191506146b2826018830160208801613ace565b016018019998505050505050505050565b7fff000000000000000000000000000000000000000000000000000000000000008860f81b1681525f7fffff000000000000000000000000000000000000000000000000000000000000808960f01b166001840152875161472b816003860160208c01613ace565b80840190507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008860601b166003820152865161476e816017840160208b01613ace565b808201915050818660f01b16601782015284519150614794826019830160208801613ace565b016019019998505050505050505050565b5f86516147b6818460208b01613ace565b9190910194855250602084019290925260f81b7fff000000000000000000000000000000000000000000000000000000000000009081166040840152166041820152604201919050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff8416602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f6020828403121561488f575f80fd5b815167ffffffffffffffff8111156148a5575f80fd5b8201601f810184136148b5575f80fd5b80516148c3613cc382613c61565b8181528560208385010111156148d7575f80fd5b6148e8826020830160208601613ace565b95945050505050565b5f8060408385031215614902575f80fd5b825161490d81613dc8565b602084015190925061491e81613b6a565b809150509250929050565b5f8251614460818460208701613ace56fedf2a8080944d5cf5032b2a844602278b01199ed191a86c93ff8080821092808000000000000000000000000000000000000000000000000000000005ca1ab1e000000000000000000000000000000000000000000000000000000005ca1ab1e01bffa26469706673582212207856dfc85aae7e627fea5f616cb0ac92c48b5b310deb4f096e99c1918acf281b64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json
index a2d289423..c0957d5d8 100644
--- a/compiled-contracts/PolygonZkEVMGlobalExitRoot.json
+++ b/compiled-contracts/PolygonZkEVMGlobalExitRoot.json
@@ -19,11 +19,36 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyAllowedContracts",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -141,8 +166,8 @@
"type": "function"
}
],
- "bytecode": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205b8fae68ff3c2dfc257497be9184a2e772688dbece1343c3dc2e8c1923291be864736f6c63430008140033",
+ "bytecode": "0x60c060405234801561000f575f80fd5b506040516103e13803806103e183398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103226100bf5f395f818160e301526101b601525f818161012f015261016d01526103225ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205501a0b5f6528630e98aa39629f5866242070924e93a8290cdc0815e798a54e064736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061007a575f3560e01c806333d6247d1161005857806333d6247d146100c15780633ed691ef146100d65780635ec6a8df146100de578063a3c573eb1461012a575f80fd5b806301fd90441461007e578063257b363214610099578063319cf735146100b8575b5f80fd5b6100865f5481565b6040519081526020015b60405180910390f35b6100866100a73660046102d5565b60026020525f908152604090205481565b61008660015481565b6100d46100cf3660046102d5565b610151565b005b61008661029b565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610090565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361019f575060018290558161021a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036101e8575f83905582915061021a565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f8181526002602052604081205491925003610295575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6102d06001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f602082840312156102e5575f80fd5b503591905056fea26469706673582212205501a0b5f6528630e98aa39629f5866242070924e93a8290cdc0815e798a54e064736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootL2.json b/compiled-contracts/PolygonZkEVMGlobalExitRootL2.json
index f65b728ae..e3730c605 100644
--- a/compiled-contracts/PolygonZkEVMGlobalExitRootL2.json
+++ b/compiled-contracts/PolygonZkEVMGlobalExitRootL2.json
@@ -14,11 +14,36 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyAllowedContracts",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
{
"inputs": [],
"name": "bridgeAddress",
@@ -78,8 +103,8 @@
"type": "function"
}
],
- "bytecode": "0x60a060405234801561000f575f80fd5b5060405161023538038061023583398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101ab61008a5f395f818160a3015261010201526101ab5ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033",
+ "bytecode": "0x60a060405234801561000f575f80fd5b5060405161023538038061023583398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516101ab61008a5f395f818160a3015261010201526101ab5ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea2646970667358221220f0dec969a2669fd94b3380929dea675446930b1e14fb6c675a20514321fc81fd64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea2646970667358221220f0dec969a2669fd94b3380929dea675446930b1e14fb6c675a20514321fc81fd64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootL2Mock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootL2Mock.json
index 793f73c8e..d3360d6b8 100644
--- a/compiled-contracts/PolygonZkEVMGlobalExitRootL2Mock.json
+++ b/compiled-contracts/PolygonZkEVMGlobalExitRootL2Mock.json
@@ -14,11 +14,36 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyAllowedContracts",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
{
"inputs": [],
"name": "bridgeAddress",
@@ -109,8 +134,8 @@
"type": "function"
}
],
- "bytecode": "0x60a060405234801561000f575f80fd5b506040516102a73803806102a783398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b60805161021d61008a5f395f818160fa0152610159015261021d5ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c806333d6247d1161004d57806333d6247d146100c357806396e07459146100d6578063a3c573eb146100f5575f80fd5b806301fd904414610073578063116c40c31461008f578063257b3632146100a4575b5f80fd5b61007c60015481565b6040519081526020015b60405180910390f35b6100a261009d3660046101b0565b600155565b005b61007c6100b23660046101b0565b5f6020819052908152604090205481565b6100a26100d13660046101b0565b610141565b6100a26100e43660046101c7565b5f9182526020829052604090912055565b61011c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610086565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461009d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156101c0575f80fd5b5035919050565b5f80604083850312156101d8575f80fd5b5050803592602090910135915056fea26469706673582212200429aefffcbf7324bb1dde3a45be34c3a7310774300755b6ec66494ae7db89ec64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c806333d6247d1161004d57806333d6247d146100c357806396e07459146100d6578063a3c573eb146100f5575f80fd5b806301fd904414610073578063116c40c31461008f578063257b3632146100a4575b5f80fd5b61007c60015481565b6040519081526020015b60405180910390f35b6100a261009d3660046101b0565b600155565b005b61007c6100b23660046101b0565b5f6020819052908152604090205481565b6100a26100d13660046101b0565b610141565b6100a26100e43660046101c7565b5f9182526020829052604090912055565b61011c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610086565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461009d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156101c0575f80fd5b5035919050565b5f80604083850312156101d8575f80fd5b5050803592602090910135915056fea26469706673582212200429aefffcbf7324bb1dde3a45be34c3a7310774300755b6ec66494ae7db89ec64736f6c63430008140033",
+ "bytecode": "0x60a060405234801561000f575f80fd5b506040516102a73803806102a783398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b60805161021d61008a5f395f818160fa0152610159015261021d5ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c806333d6247d1161004d57806333d6247d146100c357806396e07459146100d6578063a3c573eb146100f5575f80fd5b806301fd904414610073578063116c40c31461008f578063257b3632146100a4575b5f80fd5b61007c60015481565b6040519081526020015b60405180910390f35b6100a261009d3660046101b0565b600155565b005b61007c6100b23660046101b0565b5f6020819052908152604090205481565b6100a26100d13660046101b0565b610141565b6100a26100e43660046101c7565b5f9182526020829052604090912055565b61011c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610086565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461009d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156101c0575f80fd5b5035919050565b5f80604083850312156101d8575f80fd5b5050803592602090910135915056fea264697066735822122029aa25f27176bf7f20e5db9aedfaa38745c80a316af8f28eada5a20cc846bb5364736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061006f575f3560e01c806333d6247d1161004d57806333d6247d146100c357806396e07459146100d6578063a3c573eb146100f5575f80fd5b806301fd904414610073578063116c40c31461008f578063257b3632146100a4575b5f80fd5b61007c60015481565b6040519081526020015b60405180910390f35b6100a261009d3660046101b0565b600155565b005b61007c6100b23660046101b0565b5f6020819052908152604090205481565b6100a26100d13660046101b0565b610141565b6100a26100e43660046101c7565b5f9182526020829052604090912055565b61011c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610086565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461009d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f602082840312156101c0575f80fd5b5035919050565b5f80604083850312156101d8575f80fd5b5050803592602090910135915056fea264697066735822122029aa25f27176bf7f20e5db9aedfaa38745c80a316af8f28eada5a20cc846bb5364736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json
index 6bde95a70..153975a6a 100644
--- a/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json
+++ b/compiled-contracts/PolygonZkEVMGlobalExitRootMock.json
@@ -19,11 +19,36 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyAllowedContracts",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
{
"anonymous": false,
"inputs": [
@@ -172,8 +197,8 @@
"type": "function"
}
],
- "bytecode": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212200799b5f60aa8eaf6d49205025cc41bfba78ce4f6ad614164e5da3c0bdc94810464736f6c63430008140033",
+ "bytecode": "0x60c060405234801561000f575f80fd5b5060405161047838038061047883398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a0516103b86100c05f395f818161013a015261022c01525f818161018601526101e301526103b85ff3fe608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212205ab2d2ac2787ab66569e655f4a1bb90f7ac88a867ea1c7b1e4da0073f030121164736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061009f575f3560e01c806333d6247d116100725780635bcef673116100585780635bcef673146101165780635ec6a8df14610135578063a3c573eb14610181575f80fd5b806333d6247d146100fb5780633ed691ef1461010e575f80fd5b806301fd9044146100a3578063051a9e28146100be578063257b3632146100d3578063319cf735146100f2575b5f80fd5b6100ab5f5481565b6040519081526020015b60405180910390f35b6100d16100cc36600461034b565b6101a8565b005b6100ab6100e136600461034b565b60026020525f908152604090205481565b6100ab60015481565b6100d161010936600461034b565b6101c7565b6100ab610311565b6100d1610124366004610362565b5f9182526002602052604090912055565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b8060025f6101b4610311565b815260208101919091526040015f205550565b5f5460015473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102155750600182905581610290565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361025e575f839055829150610290565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516020808201849052818301859052825180830384018152606090920190925280519101205f905f818152600260205260408120549192500361030b575f8181526002602052604080822042905551849184917f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce39190a35b50505050565b5f6103466001545f54604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b905090565b5f6020828403121561035b575f80fd5b5035919050565b5f8060408385031215610373575f80fd5b5050803592602090910135915056fea26469706673582212205ab2d2ac2787ab66569e655f4a1bb90f7ac88a867ea1c7b1e4da0073f030121164736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json
index 9a4cd13f4..146245ac2 100644
--- a/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json
+++ b/compiled-contracts/PolygonZkEVMGlobalExitRootV2.json
@@ -19,16 +19,73 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
+ {
+ "inputs": [],
+ "name": "GlobalExitRootAlreadySet",
+ "type": "error"
+ },
{
"inputs": [],
"name": "MerkleTreeFull",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "NotEnoughGlobalExitRootsInserted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotLastInsertedGlobalExitRoot",
+ "type": "error"
+ },
{
"inputs": [],
"name": "OnlyAllowedContracts",
"type": "error"
},
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootRemover",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "OnlyGlobalExitRootUpdater",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint32",
+ "name": "leafCount",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "currentL1InfoRoot",
+ "type": "bytes32"
+ }
+ ],
+ "name": "InitL1InfoRootMap",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint8",
+ "name": "version",
+ "type": "uint8"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
{
"anonymous": false,
"inputs": [
@@ -48,6 +105,37 @@
"name": "UpdateL1InfoTree",
"type": "event"
},
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "currentL1InfoRoot",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint32",
+ "name": "leafCount",
+ "type": "uint32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "blockhash",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "minTimestamp",
+ "type": "uint64"
+ }
+ ],
+ "name": "UpdateL1InfoTreeV2",
+ "type": "event"
+ },
{
"inputs": [],
"name": "bridgeAddress",
@@ -177,6 +265,32 @@
"stateMutability": "view",
"type": "function"
},
+ {
+ "inputs": [],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint32",
+ "name": "leafCount",
+ "type": "uint32"
+ }
+ ],
+ "name": "l1InfoRootMap",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "l1InfoRoot",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
{
"inputs": [],
"name": "lastMainnetExitRoot",
@@ -264,8 +378,8 @@
"type": "function"
}
],
- "bytecode": "0x60c060405234801561000f575f80fd5b50604051610b03380380610b0383398101604081905261002e91610060565b6001600160a01b0391821660a05216608052610091565b80516001600160a01b038116811461005b575f80fd5b919050565b5f8060408385031215610071575f80fd5b61007a83610045565b915061008860208401610045565b90509250929050565b60805160a051610a436100c05f395f818161014101526102ba01525f8181610210015261026e0152610a435ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122051a05a35ac88fdcc6044925b155542688003cc311dd484f2331363234620430c64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806349b7b8021161007d57806383f244031161005857806383f24403146101f8578063a3c573eb1461020b578063fb57083414610232575f80fd5b806349b7b8021461013c5780635ca1e165146101885780635d81050114610190575f80fd5b8063319cf735116100ad578063319cf7351461011657806333d6247d1461011f5780633ed691ef14610134575f80fd5b806301fd9044146100d3578063257b3632146100ee5780632dfdf0b51461010d575b5f80fd5b6100db5f5481565b6040519081526020015b60405180910390f35b6100db6100fc366004610709565b60026020525f908152604090205481565b6100db60235481565b6100db60015481565b61013261012d366004610709565b610255565b005b6100db6103f6565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e5565b6100db610409565b6100db61019e366004610720565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6100db61020636600461078b565b610412565b6101637f000000000000000000000000000000000000000000000000000000000000000081565b6102456102403660046107c7565b6104e7565b60405190151581526020016100e5565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102a357505060018190555f5481610322565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102f05750505f8190556001548190610322565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61032d82846104fe565b5f81815260026020526040812054919250036103f0575f61034f600143610839565b5f8381526002602090815260409182902092409283905581518082018690528083018490527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b16606082015282518082036048018152606890910190925281519101209091506103c29061052d565b604051849084907fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b3905f90a3505b50505050565b5f6104046001545f546104fe565b905090565b5f61040461062d565b5f83815b60208110156104de57600163ffffffff8516821c81169003610481578481602081106104445761044461084c565b602002013582604051602001610464929190918252602082015260400190565b6040516020818303038152906040528051906020012091506104cc565b818582602081106104945761049461084c565b60200201356040516020016104b3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b806104d681610879565b915050610416565b50949350505050565b5f816104f4868686610412565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b80600161053c602060026109ce565b6105469190610839565b60235410610580576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461058f90610879565b918290555090505f5b602081101561061f578082901c6001166001036105cb5782600382602081106105c3576105c361084c565b015550505050565b600381602081106105de576105de61084c565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061061790610879565b915050610598565b506106286109e0565b505050565b6023545f90819081805b6020811015610700578083901c60011660010361069457600381602081106106615761066161084c565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506106c1565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806106f890610879565b915050610637565b50919392505050565b5f60208284031215610719575f80fd5b5035919050565b5f805f60608486031215610732575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610757575f80fd5b809150509250925092565b806104008101831015610527575f80fd5b803563ffffffff81168114610786575f80fd5b919050565b5f805f610440848603121561079e575f80fd5b833592506107af8560208601610762565b91506107be6104208501610773565b90509250925092565b5f805f8061046085870312156107db575f80fd5b843593506107ec8660208701610762565b92506107fb6104208601610773565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156105275761052761080c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036108a9576108a961080c565b5060010190565b600181815b8085111561090957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156108ef576108ef61080c565b808516156108fc57918102915b93841c93908002906108b5565b509250929050565b5f8261091f57506001610527565b8161092b57505f610527565b8160018114610941576002811461094b57610967565b6001915050610527565b60ff84111561095c5761095c61080c565b50506001821b610527565b5060208310610133831016604e8410600b841016171561098a575081810a610527565b61099483836108b0565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156109c6576109c661080c565b029392505050565b5f6109d98383610911565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea264697066735822122051a05a35ac88fdcc6044925b155542688003cc311dd484f2331363234620430c64736f6c63430008140033",
+ "bytecode": "0x60c060405234801561000f575f80fd5b50604051610e9d380380610e9d83398101604081905261002e9161012b565b6001600160a01b0380831660a0528116608052610049610050565b505061015c565b602e54610100900460ff16156100bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b602e5460ff908116101561010e57602e805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b0381168114610126575f80fd5b919050565b5f806040838503121561013c575f80fd5b61014583610110565b915061015360208401610110565b90509250929050565b60805160a051610d1261018b5f395f818161015701526102f701525f818161022e01526102ab0152610d125ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80635ca1e1651161008857806383f244031161006357806383f2440314610216578063a3c573eb14610229578063ef4eeb3514610250578063fb5708341461026f575f80fd5b80635ca1e1651461019e5780635d810501146101a65780638129fc1c1461020e575f80fd5b8063319cf735116100c3578063319cf7351461012c57806333d6247d146101355780633ed691ef1461014a57806349b7b80214610152575f80fd5b806301fd9044146100e9578063257b3632146101045780632dfdf0b514610123575b5f80fd5b6100f15f5481565b6040519081526020015b60405180910390f35b6100f16101123660046109bf565b60026020525f908152604090205481565b6100f160235481565b6100f160015481565b6101486101433660046109bf565b610292565b005b6100f16104b8565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fb565b6100f16104cb565b6100f16101b43660046109d6565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6101486104d4565b6100f1610224366004610a41565b6106c8565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6100f161025e366004610a7d565b602f6020525f908152604090205481565b61028261027d366004610a9d565b61079d565b60405190151581526020016100fb565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e057505060018190555f548161035f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361032d5750505f819055600154819061035f565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61036a82846107b4565b5f81815260026020526040812054919250036104b257425f61038d600143610b0f565b5f8481526002602090815260409182902092409283905581518082018790528083018490527fffffffffffffffff00000000000000000000000000000000000000000000000060c087901b1660608201528251808203604801815260689091019092528151910120909150610401906107e3565b5f61040a6104cb565b60235463ffffffff165f908152602f602052604080822083905551919250879187917fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b391a360235463ffffffff167faf6c6cd7790e0180a4d22eb8ed846e55846f54ed10e5946db19972b5a0813a598284866040516104a693929190928352602083019190915267ffffffffffffffff16604082015260600190565b60405180910390a25050505b50505050565b5f6104c66001545f546107b4565b905090565b5f6104c66108e3565b602e54610100900460ff16158080156104f45750602e54600160ff909116105b8061050e5750303b15801561050e5750602e5460ff166001145b61059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156105fc57602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6106056104cb565b6023805463ffffffff9081165f908152602f602090815260409182902085905592548151921682529181018390529192507f11f50c71891002839c2637ce302087160298255a87f1ea60d40e8db081383fad910160405180910390a15080156106c557602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b5f83815b602081101561079457600163ffffffff8516821c81169003610737578481602081106106fa576106fa610b22565b60200201358260405160200161071a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610782565b8185826020811061074a5761074a610b22565b6020020135604051602001610769929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061078c81610b4f565b9150506106cc565b50949350505050565b5f816107aa8686866106c8565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016107f260206002610ca4565b6107fc9190610b0f565b60235410610836576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461084590610b4f565b918290555090505f5b60208110156108d5578082901c60011660010361088157826003826020811061087957610879610b22565b015550505050565b6003816020811061089457610894610b22565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806108cd90610b4f565b91505061084e565b506108de610caf565b505050565b6023545f90819081805b60208110156109b6578083901c60011660010361094a576003816020811061091757610917610b22565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610977565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109ae90610b4f565b9150506108ed565b50919392505050565b5f602082840312156109cf575f80fd5b5035919050565b5f805f606084860312156109e8575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610a0d575f80fd5b809150509250925092565b8061040081018310156107dd575f80fd5b803563ffffffff81168114610a3c575f80fd5b919050565b5f805f6104408486031215610a54575f80fd5b83359250610a658560208601610a18565b9150610a746104208501610a29565b90509250925092565b5f60208284031215610a8d575f80fd5b610a9682610a29565b9392505050565b5f805f806104608587031215610ab1575f80fd5b84359350610ac28660208701610a18565b9250610ad16104208601610a29565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156107dd576107dd610ae2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b7f57610b7f610ae2565b5060010190565b600181815b80851115610bdf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610bc557610bc5610ae2565b80851615610bd257918102915b93841c9390800290610b8b565b509250929050565b5f82610bf5575060016107dd565b81610c0157505f6107dd565b8160018114610c175760028114610c2157610c3d565b60019150506107dd565b60ff841115610c3257610c32610ae2565b50506001821b6107dd565b5060208310610133831016604e8410600b8410161715610c60575081810a6107dd565b610c6a8383610b86565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610c9c57610c9c610ae2565b029392505050565b5f610a968383610be7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220821207c3abfc2db239c8ffa5eaee95e754357c5f54ffdd19460aa5f36674c7c664736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80635ca1e1651161008857806383f244031161006357806383f2440314610216578063a3c573eb14610229578063ef4eeb3514610250578063fb5708341461026f575f80fd5b80635ca1e1651461019e5780635d810501146101a65780638129fc1c1461020e575f80fd5b8063319cf735116100c3578063319cf7351461012c57806333d6247d146101355780633ed691ef1461014a57806349b7b80214610152575f80fd5b806301fd9044146100e9578063257b3632146101045780632dfdf0b514610123575b5f80fd5b6100f15f5481565b6040519081526020015b60405180910390f35b6100f16101123660046109bf565b60026020525f908152604090205481565b6100f160235481565b6100f160015481565b6101486101433660046109bf565b610292565b005b6100f16104b8565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100fb565b6100f16104cb565b6100f16101b43660046109d6565b604080516020808201959095528082019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660608301528051604881840301815260689092019052805191012090565b6101486104d4565b6100f1610224366004610a41565b6106c8565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b6100f161025e366004610a7d565b602f6020525f908152604090205481565b61028261027d366004610a9d565b61079d565b60405190151581526020016100fb565b5f8073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633036102e057505060018190555f548161035f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361032d5750505f819055600154819061035f565b6040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61036a82846107b4565b5f81815260026020526040812054919250036104b257425f61038d600143610b0f565b5f8481526002602090815260409182902092409283905581518082018790528083018490527fffffffffffffffff00000000000000000000000000000000000000000000000060c087901b1660608201528251808203604801815260689091019092528151910120909150610401906107e3565b5f61040a6104cb565b60235463ffffffff165f908152602f602052604080822083905551919250879187917fda61aa7823fcd807e37b95aabcbe17f03a6f3efd514176444dae191d27fd66b391a360235463ffffffff167faf6c6cd7790e0180a4d22eb8ed846e55846f54ed10e5946db19972b5a0813a598284866040516104a693929190928352602083019190915267ffffffffffffffff16604082015260600190565b60405180910390a25050505b50505050565b5f6104c66001545f546107b4565b905090565b5f6104c66108e3565b602e54610100900460ff16158080156104f45750602e54600160ff909116105b8061050e5750303b15801561050e5750602e5460ff166001145b61059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840160405180910390fd5b602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156105fc57602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b5f6106056104cb565b6023805463ffffffff9081165f908152602f602090815260409182902085905592548151921682529181018390529192507f11f50c71891002839c2637ce302087160298255a87f1ea60d40e8db081383fad910160405180910390a15080156106c557602e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b5f83815b602081101561079457600163ffffffff8516821c81169003610737578481602081106106fa576106fa610b22565b60200201358260405160200161071a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610782565b8185826020811061074a5761074a610b22565b6020020135604051602001610769929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b8061078c81610b4f565b9150506106cc565b50949350505050565b5f816107aa8686866106c8565b1495945050505050565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b8060016107f260206002610ca4565b6107fc9190610b0f565b60235410610836576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60235f815461084590610b4f565b918290555090505f5b60208110156108d5578082901c60011660010361088157826003826020811061087957610879610b22565b015550505050565b6003816020811061089457610894610b22565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925080806108cd90610b4f565b91505061084e565b506108de610caf565b505050565b6023545f90819081805b60208110156109b6578083901c60011660010361094a576003816020811061091757610917610b22565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610977565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109ae90610b4f565b9150506108ed565b50919392505050565b5f602082840312156109cf575f80fd5b5035919050565b5f805f606084860312156109e8575f80fd5b8335925060208401359150604084013567ffffffffffffffff81168114610a0d575f80fd5b809150509250925092565b8061040081018310156107dd575f80fd5b803563ffffffff81168114610a3c575f80fd5b919050565b5f805f6104408486031215610a54575f80fd5b83359250610a658560208601610a18565b9150610a746104208501610a29565b90509250925092565b5f60208284031215610a8d575f80fd5b610a9682610a29565b9392505050565b5f805f806104608587031215610ab1575f80fd5b84359350610ac28660208701610a18565b9250610ad16104208601610a29565b939692955092936104400135925050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156107dd576107dd610ae2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b7f57610b7f610ae2565b5060010190565b600181815b80851115610bdf57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610bc557610bc5610ae2565b80851615610bd257918102915b93841c9390800290610b8b565b509250929050565b5f82610bf5575060016107dd565b81610c0157505f6107dd565b8160018114610c175760028114610c2157610c3d565b60019150506107dd565b60ff841115610c3257610c32610ae2565b50506001821b6107dd565b5060208310610133831016604e8410600b8410161715610c60575081810a6107dd565b610c6a8383610b86565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610c9c57610c9c610ae2565b029392505050565b5f610a968383610be7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220821207c3abfc2db239c8ffa5eaee95e754357c5f54ffdd19460aa5f36674c7c664736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMMock.json b/compiled-contracts/PolygonZkEVMMock.json
index e64320ada..922ee6291 100644
--- a/compiled-contracts/PolygonZkEVMMock.json
+++ b/compiled-contracts/PolygonZkEVMMock.json
@@ -1935,8 +1935,8 @@
"type": "function"
}
],
- "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea2646970667358221220038c52f3bb0c2a50a3bf05e72805503f2e253770ce557d1b39af4a50601925ef64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea2646970667358221220038c52f3bb0c2a50a3bf05e72805503f2e253770ce557d1b39af4a50601925ef64736f6c63430008140033",
+ "bytecode": "0x61014060405234801562000011575f80fd5b5060405162006f2038038062006f208339810160408190526200003491620000a2565b6001600160a01b0395861660c05293851660805291841660a05290921660e0526001600160401b039182166101005216610120526200012a565b6001600160a01b038116811462000083575f80fd5b50565b80516001600160401b03811681146200009d575f80fd5b919050565b5f805f805f8060c08789031215620000b8575f80fd5b8651620000c5816200006e565b6020880151909650620000d8816200006e565b6040880151909550620000eb816200006e565b6060880151909450620000fe816200006e565b92506200010e6080880162000086565b91506200011e60a0880162000086565b90509295509295509295565b60805160a05160c05160e0516101005161012051616d29620001f75f395f818161081501528181611a560152613e5601525f81816109a70152611a2c01525f818161096d015281816129e3015281816144e701526159e601525f8181610b380152818161170c01528181611bc801528181611d93015281816125f001528181612db101528181614757015261554301525f8181610bf801528181614eac01526152fa01525f8181610a75015281816129b1015281816132d90152818161472c0152614f980152616d295ff3fe608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea264697066735822122009e03fb16d1dca934eb1a5f515609cdcf05c6112fcca4f18507a4541ffa9178b64736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610475575f3560e01c80638c3d73011161025d578063c754c7ed11610148578063e7a7ed02116100c3578063f14916d611610093578063f851a44011610079578063f851a44014610c80578063f8b823e414610ca0578063fe16564f14610ca9575f80fd5b8063f14916d614610c5a578063f2fde38b14610c6d575f80fd5b8063e7a7ed0214610bc3578063e8bf92ed14610bf3578063eaeb077b14610c1a578063ed6b010414610c2d575f80fd5b8063d2e129f911610118578063d939b315116100fe578063d939b31514610b80578063dbc1697614610ba8578063e0d1744114610bb0575f80fd5b8063d2e129f914610b5a578063d8d1091b14610b6d575f80fd5b8063c754c7ed14610ac5578063c89e42df14610af1578063cfa8ed4714610b04578063d02103ca14610b33575f80fd5b8063ada8f919116101d8578063b4f77ea9116101a8578063ba58ae391161018e578063ba58ae3914610a97578063c0cad30214610aaa578063c0ed84e014610abd575f80fd5b8063b4f77ea914610a5d578063b6b0b09714610a70575f80fd5b8063ada8f9191461098f578063adc879e9146109a2578063afd23cbe146109c9578063b4d63f58146109f7575f80fd5b80639aa972a31161022d5780639c9f3dfe116102135780639c9f3dfe14610942578063a066215c14610955578063a3c573eb14610968575f80fd5b80639aa972a31461091c5780639b7967601461092f575f80fd5b80638c3d7301146108db5780638da5cb5b146108e357806396dc3d391461090157806399f5634e14610914575f80fd5b80634a1a89a71161037d578063621dd411116102f85780637215541a116102c8578063831c7ead116102ae578063831c7ead14610810578063837a473814610837578063841b24d7146108ab575f80fd5b80637215541a146107e95780637fcb3653146107fc575f80fd5b8063621dd4111461079c5780636b8616ce146107af5780636ff512cc146107ce578063715018a6146107e1575f80fd5b8063542028d51161034d5780635e9145c9116103335780635e9145c9146107795780635ec919581461078c5780636046916914610794575f80fd5b8063542028d5146106d0578063574f649e146106d8575f80fd5b80634a1a89a71461066b5780634a910e6a1461068b5780634e4877061461069e5780635392c5e0146106b1575f80fd5b8063267822471161040d578063383b3be8116103dd578063423fa856116103c3578063423fa8561461060f578063456052671461062f578063458c047714610657575f80fd5b8063383b3be8146105e9578063394218e9146105fc575f80fd5b8063267822471461055257806329878983146105975780632b0006fa146105c35780632c1f816a146105d6575f80fd5b806315064c961161044857806315064c96146104fb5780631816b7e51461051857806319d8ac611461052b578063220d78991461053f575f80fd5b80630a0d9fbe146104795780630eaa86ea146104b0578063107bf28c146104d157806310a01a72146104e6575b5f80fd5b606f5461049290610100900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6104c36104be366004615fac565b610cbc565b6040519081526020016104a7565b6104d961118c565b6040516104a79190616068565b6104f96104f4366004616097565b611218565b005b606f546105089060ff1681565b60405190151581526020016104a7565b6104f9610526366004616124565b6117c6565b6073546104929067ffffffffffffffff1681565b6104d961054d366004616145565b6118de565b607b546105729073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016104a7565b6074546105729068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6104f96105d136600461619f565b611ab4565b6104f96105e4366004616203565b611c7e565b6105086105f7366004616278565b611e86565b6104f961060a366004616278565b611edb565b6073546104929068010000000000000000900467ffffffffffffffff1681565b60735461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6079546104929067ffffffffffffffff1681565b6079546104929068010000000000000000900467ffffffffffffffff1681565b6104f9610699366004616278565b61205f565b6104f96106ac366004616278565b612112565b6104c36106bf366004616278565b60756020525f908152604090205481565b6104d9612296565b6104c36106e6366004616388565b835160209485012060408051808701979097528681019190915260608087019490945260c09290921b7fffffffffffffffff00000000000000000000000000000000000000000000000016608086015290911b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660888401528051808403607c018152609c9093019052815191012090565b6104f961078736600461643d565b6122a3565b6104f9612a9c565b6104c3612b9b565b6104f96107aa36600461619f565b612bb0565b6104c36107bd366004616278565b60716020525f908152604090205481565b6104f96107dc36600461648d565b612f2e565b6104f9613003565b6104f96107f7366004616278565b613016565b6074546104929067ffffffffffffffff1681565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b61087f6108453660046164a6565b60786020525f908152604090208054600182015460029092015467ffffffffffffffff808316936801000000000000000090930416919084565b6040805167ffffffffffffffff95861681529490931660208501529183015260608201526080016104a7565b607954610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9613183565b60335473ffffffffffffffffffffffffffffffffffffffff16610572565b6104f961090f366004616278565b61324f565b6104c3613292565b6104f961092a366004616203565b6133e5565b6104f961093d366004616278565b613495565b6104f9610950366004616278565b6134e4565b6104f9610963366004616278565b613660565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f961099d36600461648d565b613766565b6104927f000000000000000000000000000000000000000000000000000000000000000081565b606f546109e4906901000000000000000000900461ffff1681565b60405161ffff90911681526020016104a7565b610a37610a05366004616278565b60726020525f90815260409020805460019091015467ffffffffffffffff808216916801000000000000000090041683565b6040805193845267ffffffffffffffff92831660208501529116908201526060016104a7565b6104f9610a6b366004616278565b61382a565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b610508610aa53660046164a6565b61383b565b6104f9610ab83660046164bd565b6138c3565b6104926138db565b607b546104929074010000000000000000000000000000000000000000900467ffffffffffffffff1681565b6104f9610aff3660046164bd565b61392e565b606f54610572906b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610b6836600461652d565b6139bb565b6104f9610b7b3660046165d8565b613ef9565b60795461049290700100000000000000000000000000000000900467ffffffffffffffff1681565b6104f9614494565b6104f9610bbe366004616617565b614568565b607354610492907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1681565b6105727f000000000000000000000000000000000000000000000000000000000000000081565b6104f9610c28366004616661565b6145f7565b607b54610508907c0100000000000000000000000000000000000000000000000000000000900460ff1681565b6104f9610c6836600461648d565b6149e7565b6104f9610c7b36600461648d565b614ab9565b607a546105729073ffffffffffffffffffffffffffffffffffffffff1681565b6104c360705481565b6104f9610cb73660046166a9565b614b6d565b5f805f610cc76138db565b905067ffffffffffffffff881615610e935760795467ffffffffffffffff9081169089161115610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a4015b60405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614610e8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b5061102b565b67ffffffffffffffff87165f90815260756020526040902054915081610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168767ffffffffffffffff16111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168667ffffffffffffffff16116110f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f61110288888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161113691906166d3565b602060405180830381855afa158015611151573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117491906166ee565b61117e9190616732565b9a9950505050505050505050565b6077805461119990616745565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590616745565b80156112105780601f106111e757610100808354040283529160200191611210565b820191905f5260205f20905b8154815290600101906020018083116111f357829003601f168201915b505050505081565b611220614b8f565b5f8061122a6138db565b905067ffffffffffffffff8a16156113f15760795467ffffffffffffffff908116908b161115611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605860248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2070656e60448201527f64696e6753746174654e756d206d757374206265206c657373206f722065717560648201527f616c207468616e206c61737450656e64696e6753746174650000000000000000608482015260a401610d9b565b67ffffffffffffffff808b165f9081526078602052604090206002810154815490945090918b81166801000000000000000090920416146113eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206d61746368207468652070656e64696e6760648201527f2073746174652062617463680000000000000000000000000000000000000000608482015260a401610d9b565b50611589565b67ffffffffffffffff89165f908152607560205260409020549150816114bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d426174636820737461746520726f6f7420646f6573206e6f7420657860648201527f6973740000000000000000000000000000000000000000000000000000000000608482015260a401610d9b565b8067ffffffffffffffff168967ffffffffffffffff161115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605d60248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a20696e6960448201527f744e756d4261746368206d757374206265206c657373206f7220657175616c2060648201527f7468616e2063757272656e744c61737456657269666965644261746368000000608482015260a401610d9b565b8067ffffffffffffffff168867ffffffffffffffff1611611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f506f6c79676f6e5a6b45564d3a3a766572696679426174636865733a2066696e60448201527f616c4e65774261746368206d75737420626520626967676572207468616e206360648201527f757272656e744c61737456657269666965644261746368000000000000000000608482015260a401610d9b565b5f6116608a8a8a868b6118de565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8c81169182179092555f90815260756020526040902089905560795491925016156116dd57607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018990527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611762575f80fd5b505af1158015611774573d5f803e3d5ffd5b505060405189815233925067ffffffffffffffff8c1691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe9060200160405180910390a35050505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88161ffff16108061183057506103ff8161ffff16115b15611867576040517f4c2533c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffff16690100000000000000000061ffff8416908102919091179091556040519081527f7019933d795eba185c180209e8ae8bffbaa25bcef293364687702c31f4d302c5906020015b60405180910390a150565b67ffffffffffffffff8086165f818152607260205260408082205493881682529020546060929115801590611911575081155b15611948576040517f6818c29e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061197f576040517f66385b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119888461383b565b6119be576040517f176b913c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481019690965260548601929092527fffffffffffffffff00000000000000000000000000000000000000000000000060c098891b811660748701527f0000000000000000000000000000000000000000000000000000000000000000891b8116607c8701527f0000000000000000000000000000000000000000000000000000000000000000891b81166084870152608c86019490945260ac85015260cc840194909452509290931b90911660ec830152805180830360d401815260f4909201905290565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611b11576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b1f868686868686614c10565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611b9957607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611c1e575f80fd5b505af1158015611c30573d5f803e3d5ffd5b505060405184815233925067ffffffffffffffff871691507fcb339b570a7f0b25afa7333371ff11192092a0aeace12b671f4c212f2815c6fe906020015b60405180910390a3505050505050565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314611cdb576040517fbbcbbc0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cea87878787878787614fcb565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615611d6457607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015611de9575f80fd5b505af1158015611dfb573d5f803e3d5ffd5b50506079805477ffffffffffffffffffffffffffffffffffffffffffffffff167a093a800000000000000000000000000000000000000000000000001790555050604051828152339067ffffffffffffffff8616907fcc1b5520188bf1dd3e63f98164b577c4d75c11a619ddea692112f0d1aec4cf729060200160405180910390a350505050505050565b60795467ffffffffffffffff8281165f9081526078602052604081205490924292611ec992700100000000000000000000000000000000909204811691166167c3565b67ffffffffffffffff16111592915050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314611f2c576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff82161115611f73576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff16611fe25760795467ffffffffffffffff7801000000000000000000000000000000000000000000000000909104811690821610611fe2576040517f401636df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527f1f4fa24c2e4bad19a7f3ec5c5485f70d46c798461c2e684f55bbd0fc661373a1906020016118d3565b60745468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16331461210657606f5460ff16156120c7576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120d081611e86565b612106576040517f0ce9e4a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61210f816153fa565b50565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612163576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff821611156121aa576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1661221557607b5467ffffffffffffffff74010000000000000000000000000000000000000000909104811690821610612215576040517ff5e37f2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fa7eb6cb8a613eb4e8bddc1ac3d61ec6cf10898760f0b187bcca794c6ca6fa40b906020016118d3565b6076805461119990616745565b606f5460ff16156122e0576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546b010000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314612340576040517f11e7be1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f81900361237b576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e88111156123b7576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f81815260726020526040812054838516949293700100000000000000000000000000000000909304909216919082905b868110156127ff575f8a8a8381811061241d5761241d6167eb565b905060200281019061242f9190616818565b6124389061684a565b8051805160209091012060608201519192509067ffffffffffffffff16156125ad5785612464816168d4565b9650505f81836020015184606001516040516020016124bb93929190928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff8a165f90815260719093529120549091508114612543576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8088165f9081526071602052604080822091909155606085015190850151908216911610156125a7576040517f7f7ab87200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506126e7565b602082015115801590612671575060208201516040517f257b363200000000000000000000000000000000000000000000000000000000815260048101919091527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063257b3632906024016020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906166ee565b155b156126a8576040517f73bd668d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516201d4c010156126e7576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8767ffffffffffffffff16826040015167ffffffffffffffff16108061271a575042826040015167ffffffffffffffff16115b15612751576040517fea82791600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602082810151604080850151815193840189905290830184905260608084019290925260c01b7fffffffffffffffff0000000000000000000000000000000000000000000000001660808301528b901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c0160405160208183030381529060405280519060200120945081604001519750505080806127f7906168fa565b915050612402565b5061280a86856167c3565b60735490945067ffffffffffffffff780100000000000000000000000000000000000000000000000090910481169084161115612873576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61287e8285616931565b6128929067ffffffffffffffff1688616952565b604080516060810182528581524267ffffffffffffffff908116602080840191825260738054680100000000000000009081900485168688019081528d86165f8181526072909552979093209551865592516001909501805492519585167fffffffffffffffffffffffffffffffff000000000000000000000000000000009384161795851684029590951790945583548c841691161793029290921790559091508281169085161461298757607380547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8716021790555b6129d933308360705461299a9190616965565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016929190615607565b6129e16156e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379e2cf976040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a46575f80fd5b505af1158015612a58573d5f803e3d5ffd5b505060405167ffffffffffffffff881692507f303446e6a8cb73c83dff421c0b1d5e5ce0719dab1bff13660fc254e58cc17fce91505f90a250505050505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612aed576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b547c0100000000000000000000000000000000000000000000000000000000900460ff16612b49576040517ff6ba91a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040517f854dd6ce5a1445c4c54388b21cffd11cf5bba1b9e763aec48ce3da75d617412f905f90a1565b5f6070546064612bab9190616965565b905090565b606f5460ff1615612bed576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff8581165f908152607260205260409020600101544292612c39927801000000000000000000000000000000000000000000000000909104811691166167c3565b67ffffffffffffffff161115612c7b576040517f8a0704d300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e8612c888686616931565b67ffffffffffffffff161115612cca576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612cd8868686868686614c10565b612ce184615794565b607954700100000000000000000000000000000000900467ffffffffffffffff165f03612e2257607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff8681169182179092555f9081526075602052604090208390556079541615612d8257607980547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b6040517f33d6247d000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015612e07575f80fd5b505af1158015612e19573d5f803e3d5ffd5b50505050612ef0565b612e2a6156e9565b6079805467ffffffffffffffff16905f612e43836168d4565b825467ffffffffffffffff9182166101009390930a92830292820219169190911790915560408051608081018252428316815287831660208083019182528284018981526060840189815260795487165f908152607890935294909120925183549251861668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009093169516949094171781559151600183015551600290910155505b604051828152339067ffffffffffffffff8616907f9c72852172521097ba7e1482e6b44b351323df0155f97f4ea18fcec28e1f596690602001611c6e565b607a5473ffffffffffffffffffffffffffffffffffffffff163314612f7f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fff0000000000000000000000000000000000000000ffffffffffffffffffffff166b01000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527ff54144f9611984021529f814a1cb6a41e22c58351510a0d9f7e822618abb9cc0906020016118d3565b61300b614b8f565b6130145f61596e565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461317b575f61303e6138db565b90508067ffffffffffffffff168267ffffffffffffffff161161308d576040517f812a372d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000909104811690831611806130d2575067ffffffffffffffff8083165f9081526072602052604090206001015416155b15613109576040517f98c5c01400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8083165f9081526072602052604090206001015442916131379162093a8091166167c3565b67ffffffffffffffff161115613179576040517fd257555a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61210f6159e4565b607b5473ffffffffffffffffffffffffffffffffffffffff1633146131d4576040517fd1ec4b2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b54607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527f056dc487bbf0795d0bbb1b4f0af523a855503cff740bfb4d5475f7a90c091e8e9060200160405180910390a1565b613257614b8f565b607480547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f90819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561331e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334291906166ee565b90505f61334d6138db565b60735467ffffffffffffffff6801000000000000000082048116916133a59170010000000000000000000000000000000082048116917801000000000000000000000000000000000000000000000000900416616931565b6133af91906167c3565b6133b99190616931565b67ffffffffffffffff169050805f036133d4575f9250505090565b6133de818361697c565b9250505090565b606f5460ff1615613422576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343187878787878787614fcb565b67ffffffffffffffff84165f908152607560209081526040918290205482519081529081018490527f1f44c21118c4603cfb4e1b621dbcfa2b73efcececee2b99b620b2953d33a7010910160405180910390a161348c6159e4565b50505050505050565b61349d614b8f565b6073805467ffffffffffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179055565b607a5473ffffffffffffffffffffffffffffffffffffffff163314613535576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62093a8067ffffffffffffffff8216111561357c576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff166135e35760795467ffffffffffffffff7001000000000000000000000000000000009091048116908216106135e3576040517f48a05a9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607980547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000067ffffffffffffffff8416908102919091179091556040519081527fc4121f4e22c69632ebb7cf1f462be0511dc034f999b52013eddfb24aab765c75906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146136b1576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620151808167ffffffffffffffff1611156136f8576040517fe067dfe800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1661010067ffffffffffffffff8416908102919091179091556040519081527f1b023231a1ab6b5d93992f168fb44498e1a7e64cef58daff6f1c216de6a68c28906020016118d3565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146137b7576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fa5b56b7906fd0a20e3f35120dd8343db1e12e037a6c90111c7e42885e82a1ce6906020016118d3565b613832614b8f565b61210f81615794565b5f67ffffffff0000000167ffffffffffffffff8316108015613872575067ffffffff00000001604083901c67ffffffffffffffff16105b8015613893575067ffffffff00000001608083901c67ffffffffffffffff16105b80156138aa575067ffffffff0000000160c083901c105b156138b757506001919050565b505f919050565b919050565b6138cb614b8f565b60776138d782826169dc565b5050565b6079545f9067ffffffffffffffff161561391d575060795467ffffffffffffffff9081165f908152607860205260409020546801000000000000000090041690565b5060745467ffffffffffffffff1690565b607a5473ffffffffffffffffffffffffffffffffffffffff16331461397f576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607661398b82826169dc565b507f6b8f723a4c7a5335cafae8a598a0aa0301be1387c037dccc085b62add6448b20816040516118d39190616068565b5f54610100900460ff16158080156139d957505f54600160ff909116105b806139f25750303b1580156139f257505f5460ff166001145b613a7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610d9b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015613ada575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b613ae7602088018861648d565b607a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055613b3c604088016020890161648d565b606f805473ffffffffffffffffffffffffffffffffffffffff929092166b010000000000000000000000027fff0000000000000000000000000000000000000000ffffffffffffffffffffff909216919091179055613ba1608088016060890161648d565b6074805473ffffffffffffffffffffffffffffffffffffffff9290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff9092169190911790555f805260756020527ff9e3fbf150b7a0077118526f473c53cb4734f166167e2c6213e3567dd390b4ad8690556076613c2b86826169dc565b506077613c3885826169dc565b5062093a80613c4d6060890160408a01616278565b67ffffffffffffffff161115613c8f576040517fcc96507000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9f6060880160408901616278565b6079805467ffffffffffffffff92909216700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff90921691909117905562093a80613d0160a0890160808a01616278565b67ffffffffffffffff161115613d43576040517f1d06e87900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5360a0880160808901616278565b6079805477ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff939093169290920291909117905567016345785d8a0000607055606f80547fffffffffffffffffffffffffffffffffffffffffff00000000000000000000ff166a03ea000000000000070800179055607b80547fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff167c0100000000000697800000000000000000000000000000000000000000179055613e32615a67565b7fed7be53c9f1a96a481223b15568a5b1a475e01a74b347d6ca187c8bf0c078cd65f7f00000000000000000000000000000000000000000000000000000000000000008585604051613e879493929190616b3b565b60405180910390a1801561348c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615613f56576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615613f93576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819003613fce576040517fcb591a5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103e881111561400a576040517fb59f753a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff78010000000000000000000000000000000000000000000000008204811691614055918491700100000000000000000000000000000000900416616b72565b111561408d576040517fc630a00d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60735467ffffffffffffffff68010000000000000000820481165f8181526072602052604081205491937001000000000000000000000000000000009004909216915b84811015614332575f8787838181106140eb576140eb6167eb565b90506020028101906140fd9190616b85565b61410690616bb7565b905083614112816168d4565b825180516020918201208185015160408087015190519499509194505f936141739386939101928352602083019190915260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016604082015260480190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012067ffffffffffffffff89165f908152607190935291205490915081146141fb576040517fce3d755e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff86165f9081526071602052604081205561421f600189616952565b840361428e5742607b60149054906101000a900467ffffffffffffffff16846040015161424c91906167c3565b67ffffffffffffffff16111561428e576040517fc44a082100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020838101516040805192830188905282018490526060808301919091524260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016608083015233901b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166088820152609c01604051602081830303815290604052805190602001209450505050808061432a906168fa565b9150506140d0565b5061433d84846167c3565b6073805467ffffffffffffffff4281167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009092168217808455604080516060810182528781526020808201958652680100000000000000009384900485168284019081528589165f818152607290935284832093518455965160019390930180549151871686027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921693871693909317179091558554938916700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff938602939093167fffffffffffffffff00000000000000000000000000000000ffffffffffffffff90941693909317919091179093559151929550917f648a61dd2438f072f5a1960939abd30f37aea80d2e94c9792ad142d3e0a490a49190a2505050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff1633146144e5576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dbc169766040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561454a575f80fd5b505af115801561455c573d5f803e3d5ffd5b50505050613014615b06565b614570614b8f565b6040805160608101825293845267ffffffffffffffff92831660208086019182529284168583019081529584165f908152607290935291209251835551600190920180549351821668010000000000000000027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169290911691909117919091179055565b607b547c0100000000000000000000000000000000000000000000000000000000900460ff1615614654576040517f24eff8c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f5460ff1615614691576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61469a612b9b565b9050818111156146d6576040517f4732fdb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611388831115614712576040517fa29a6c7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61475473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084615607565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633ed691ef6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e291906166ee565b60738054919250780100000000000000000000000000000000000000000000000090910467ffffffffffffffff1690601861481c836168d4565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550508484604051614853929190616c30565b60408051918290038220602083015281018290527fffffffffffffffff0000000000000000000000000000000000000000000000004260c01b166060820152606801604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301206073547801000000000000000000000000000000000000000000000000900467ffffffffffffffff165f9081526071909352912055323303614981576073546040805183815233602082015260609181018290525f91810191909152780100000000000000000000000000000000000000000000000090910467ffffffffffffffff16907ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc9319060800160405180910390a26149e0565b607360189054906101000a900467ffffffffffffffff1667ffffffffffffffff167ff94bb37db835f1ab585ee00041849a09b12cd081d77fa15ca070757619cbc931823388886040516149d79493929190616c3f565b60405180910390a25b5050505050565b607a5473ffffffffffffffffffffffffffffffffffffffff163314614a38576040517f4755657900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b607480547fffffffff0000000000000000000000000000000000000000ffffffffffffffff166801000000000000000073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527f61f8fec29495a3078e9271456f05fb0707fd4e41f7661865f80fc437d06681ca906020016118d3565b614ac1614b8f565b73ffffffffffffffffffffffffffffffffffffffff8116614b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d9b565b61210f8161596e565b614b75614b8f565b67ffffffffffffffff165f90815260756020526040902055565b60335473ffffffffffffffffffffffffffffffffffffffff163314613014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d9b565b5f80614c1a6138db565b905067ffffffffffffffff881615614ce95760795467ffffffffffffffff9081169089161115614c76576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8089165f908152607860205260409020600281015481549094509091898116680100000000000000009092041614614ce3576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50614d89565b67ffffffffffffffff87165f90815260756020526040902054915081614d3b576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168767ffffffffffffffff161115614d89576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8067ffffffffffffffff168667ffffffffffffffff1611614dd6576040517fb9b18f5700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f614de488888886896118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600283604051614e1891906166d3565b602060405180830381855afa158015614e33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e5691906166ee565b614e609190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a91614ee291899190600401616c74565b602060405180830381865afa158015614efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f219190616cae565b614f57576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614fbf33614f65858b616931565b67ffffffffffffffff16614f77613292565b614f819190616965565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169190615b94565b50505050505050505050565b5f67ffffffffffffffff8816156150975760795467ffffffffffffffff9081169089161115615026576040517fbb14c20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5067ffffffffffffffff8088165f908152607860205260409020600281015481549092888116680100000000000000009092041614615091576040517f2bd2e3e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50615132565b5067ffffffffffffffff85165f90815260756020526040902054806150e8576040517f4997b98600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60745467ffffffffffffffff9081169087161115615132576040517f1e56e9e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff908116908816118061516457508767ffffffffffffffff168767ffffffffffffffff1611155b8061518b575060795467ffffffffffffffff68010000000000000000909104811690881611155b156151c2576040517fbfa7079f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8781165f90815260786020526040902054680100000000000000009004811690861614615224576040517f32a2a77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61523287878785886118de565b90505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160028360405161526691906166d3565b602060405180830381855afa158015615281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152a491906166ee565b6152ae9190616732565b6040805160208101825282815290517f9121da8a00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691639121da8a9161533091889190600401616c74565b602060405180830381865afa15801561534b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061536f9190616cae565b6153a5576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89165f90815260786020526040902060020154859003614fbf576040517fa47276bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60795467ffffffffffffffff680100000000000000009091048116908216111580615434575060795467ffffffffffffffff908116908216115b1561546b576040517fd086b70b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8181165f81815260786020908152604080832080546074805468010000000000000000928390049098167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090981688179055600282015487865260759094529382902092909255607980547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff169390940292909217909255600182015490517f33d6247d00000000000000000000000000000000000000000000000000000000815260048101919091529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906333d6247d906024015f604051808303815f87803b158015615599575f80fd5b505af11580156155ab573d5f803e3d5ffd5b505050508267ffffffffffffffff168167ffffffffffffffff167f328d3c6c0fd6f1be0515e422f2d87e59f25922cbc2233568515a0c4bc3f8510e84600201546040516155fa91815260200190565b60405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526156e39085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152615bef565b50505050565b60795467ffffffffffffffff680100000000000000008204811691161115613014576079545f906157319068010000000000000000900467ffffffffffffffff1660016167c3565b905061573c81611e86565b1561210f576079545f9060029061575e90849067ffffffffffffffff16616931565b6157689190616ccd565b61577290836167c3565b905061577d81611e86565b1561578b576138d7816153fa565b6138d7826153fa565b5f61579d6138db565b9050815f806157ac8484616931565b606f5467ffffffffffffffff91821692505f916157cf9161010090041642616952565b90505b8467ffffffffffffffff168467ffffffffffffffff16146158595767ffffffffffffffff8085165f908152607260205260409020600181015490911682101561583757600181015468010000000000000000900467ffffffffffffffff169450615853565b6158418686616931565b67ffffffffffffffff16935050615859565b506157d2565b5f6158648484616952565b9050838110156158bb57808403600c811161587f5780615882565b600c5b9050806103e80a81606f60099054906101000a900461ffff1661ffff160a60705402816158b1576158b1616705565b046070555061592a565b838103600c81116158cc57806158cf565b600c5b90505f816103e80a82606f60099054906101000a900461ffff1661ffff160a670de0b6b3a7640000028161590557615905616705565b04905080607054670de0b6b3a7640000028161592357615923616705565b0460705550505b683635c9adc5dea00000607054111561594f57683635c9adc5dea0000060705561348c565b633b9aca00607054101561348c57633b9aca0060705550505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632072f6c56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015615a49575f80fd5b505af1158015615a5b573d5f803e3d5ffd5b50505050613014615cfa565b5f54610100900460ff16615afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610d9b565b6130143361596e565b606f5460ff16615b42576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052615bea9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401615661565b505050565b5f615c50826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16615d8c9092919063ffffffff16565b805190915015615bea5780806020019051810190615c6e9190616cae565b615bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610d9b565b606f5460ff1615615d37576040517f2f0047fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b6060615d9a84845f85615da2565b949350505050565b606082471015615e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610d9b565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051615e5c91906166d3565b5f6040518083038185875af1925050503d805f8114615e96576040519150601f19603f3d011682016040523d82523d5f602084013e615e9b565b606091505b5091509150615eac87838387615eb7565b979650505050505050565b60608315615f4c5782515f03615f455773ffffffffffffffffffffffffffffffffffffffff85163b615f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d9b565b5081615d9a565b615d9a8383815115615f615781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b9190616068565b803567ffffffffffffffff811681146138be575f80fd5b5f805f805f60a08688031215615fc0575f80fd5b615fc986615f95565b9450615fd760208701615f95565b9350615fe560408701615f95565b94979396509394606081013594506080013592915050565b5f5b83811015616017578181015183820152602001615fff565b50505f910152565b5f8151808452616036816020860160208601615ffd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61607a602083018461601f565b9392505050565b8060408101831015616091575f80fd5b92915050565b5f805f805f805f806101a0898b0312156160af575f80fd5b6160b889615f95565b97506160c660208a01615f95565b96506160d460408a01615f95565b955060608901359450608089013593506160f18a60a08b01616081565b925061016089018a811115616104575f80fd5b60e08a0192506161148b82616081565b9150509295985092959890939650565b5f60208284031215616134575f80fd5b813561ffff8116811461607a575f80fd5b5f805f805f60a08688031215616159575f80fd5b61616286615f95565b945061617060208701615f95565b94979496505050506040830135926060810135926080909101359150565b806103008101831015616091575f80fd5b5f805f805f806103a087890312156161b5575f80fd5b6161be87615f95565b95506161cc60208801615f95565b94506161da60408801615f95565b935060608701359250608087013591506161f78860a0890161618e565b90509295509295509295565b5f805f805f805f6103c0888a03121561621a575f80fd5b61622388615f95565b965061623160208901615f95565b955061623f60408901615f95565b945061624d60608901615f95565b93506080880135925060a0880135915061626a8960c08a0161618e565b905092959891949750929550565b5f60208284031215616288575f80fd5b61607a82615f95565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126162cd575f80fd5b813567ffffffffffffffff808211156162e8576162e8616291565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561632e5761632e616291565b81604052838152866020858801011115616346575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146138be575f80fd5b5f805f805f60a0868803121561639c575f80fd5b85359450602086013567ffffffffffffffff8111156163b9575f80fd5b6163c5888289016162be565b945050604086013592506163db60608701615f95565b91506163e960808701616365565b90509295509295909350565b5f8083601f840112616405575f80fd5b50813567ffffffffffffffff81111561641c575f80fd5b6020830191508360208260051b8501011115616436575f80fd5b9250929050565b5f805f6040848603121561644f575f80fd5b833567ffffffffffffffff811115616465575f80fd5b616471868287016163f5565b9094509250616484905060208501616365565b90509250925092565b5f6020828403121561649d575f80fd5b61607a82616365565b5f602082840312156164b6575f80fd5b5035919050565b5f602082840312156164cd575f80fd5b813567ffffffffffffffff8111156164e3575f80fd5b615d9a848285016162be565b5f8083601f8401126164ff575f80fd5b50813567ffffffffffffffff811115616516575f80fd5b602083019150836020828501011115616436575f80fd5b5f805f805f80868803610120811215616544575f80fd5b60a0811215616551575f80fd5b5086955060a0870135945060c087013567ffffffffffffffff80821115616576575f80fd5b6165828a838b016162be565b955060e0890135915080821115616597575f80fd5b6165a38a838b016162be565b94506101008901359150808211156165b9575f80fd5b506165c689828a016164ef565b979a9699509497509295939492505050565b5f80602083850312156165e9575f80fd5b823567ffffffffffffffff8111156165ff575f80fd5b61660b858286016163f5565b90969095509350505050565b5f805f806080858703121561662a575f80fd5b61663385615f95565b93506020850135925061664860408601615f95565b915061665660608601615f95565b905092959194509250565b5f805f60408486031215616673575f80fd5b833567ffffffffffffffff811115616689575f80fd5b616695868287016164ef565b909790965060209590950135949350505050565b5f80604083850312156166ba575f80fd5b823591506166ca60208401615f95565b90509250929050565b5f82516166e4818460208701615ffd565b9190910192915050565b5f602082840312156166fe575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8261674057616740616705565b500690565b600181811c9082168061675957607f821691505b602082108103616790577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b67ffffffffffffffff8181168382160190808211156167e4576167e4616796565b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126166e4575f80fd5b5f6080823603121561685a575f80fd5b6040516080810167ffffffffffffffff828210818311171561687e5761687e616291565b816040528435915080821115616892575f80fd5b5061689f368286016162be565b825250602083013560208201526168b860408401615f95565b60408201526168c960608401615f95565b606082015292915050565b5f67ffffffffffffffff8083168181036168f0576168f0616796565b6001019392505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361692a5761692a616796565b5060010190565b67ffffffffffffffff8281168282160390808211156167e4576167e4616796565b8181038181111561609157616091616796565b808202811582820484141761609157616091616796565b5f8261698a5761698a616705565b500490565b601f821115615bea575f81815260208120601f850160051c810160208610156169b55750805b601f850160051c820191505b818110156169d4578281556001016169c1565b505050505050565b815167ffffffffffffffff8111156169f6576169f6616291565b616a0a81616a048454616745565b8461698f565b602080601f831160018114616a5c575f8415616a265750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556169d4565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015616aa857888601518255948401946001909101908401616a89565b5085821015616ae457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f67ffffffffffffffff808716835280861660208401525060606040830152616b68606083018486616af4565b9695505050505050565b8082018082111561609157616091616796565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126166e4575f80fd5b5f60608236031215616bc7575f80fd5b6040516060810167ffffffffffffffff8282108183111715616beb57616beb616291565b816040528435915080821115616bff575f80fd5b50616c0c368286016162be565b82525060208301356020820152616c2560408401615f95565b604082015292915050565b818382375f9101908152919050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201525f616b68606083018486616af4565b6103208101610300808584378201835f5b6001811015616ca4578151835260209283019290910190600101616c85565b5050509392505050565b5f60208284031215616cbe575f80fd5b8151801515811461607a575f80fd5b5f67ffffffffffffffff80841680616ce757616ce7616705565b9216919091049291505056fea264697066735822122009e03fb16d1dca934eb1a5f515609cdcf05c6112fcca4f18507a4541ffa9178b64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/PolygonZkEVMTimelock.json b/compiled-contracts/PolygonZkEVMTimelock.json
index 36a06c6db..23a7ef2c2 100644
--- a/compiled-contracts/PolygonZkEVMTimelock.json
+++ b/compiled-contracts/PolygonZkEVMTimelock.json
@@ -892,8 +892,8 @@
"type": "receive"
}
],
- "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783",
- "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "bytecode": "0x60a060405234801562000010575f80fd5b5060405162002c4d38038062002c4d833981016040819052620000339162000412565b84848484620000515f8051602062002bcd8339815191528062000232565b620000795f8051602062002bed8339815191525f8051602062002bcd83398151915262000232565b620000a15f8051602062002c0d8339815191525f8051602062002bcd83398151915262000232565b620000c95f8051602062002c2d8339815191525f8051602062002bcd83398151915262000232565b620000e35f8051602062002bcd833981519152306200027c565b6001600160a01b038116156200010d576200010d5f8051602062002bcd833981519152826200027c565b5f5b83518110156200019057620001555f8051602062002bed833981519152858381518110620001415762000141620004ad565b60200260200101516200027c60201b60201c565b6200017d5f8051602062002c2d833981519152858381518110620001415762000141620004ad565b6200018881620004c1565b90506200010f565b505f5b8251811015620001d857620001c55f8051602062002c0d833981519152848381518110620001415762000141620004ad565b620001d081620004c1565b905062000193565b506002849055604080515f8152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1505050506001600160a01b031660805250620004e692505050565b5f82815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6200028882826200028c565b5050565b5f828152602081815260408083206001600160a01b038516845290915290205460ff1662000288575f828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002e63390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b634e487b7160e01b5f52604160045260245ffd5b6001600160a01b038116811462000353575f80fd5b50565b805162000363816200033e565b919050565b5f82601f83011262000378575f80fd5b815160206001600160401b03808311156200039757620003976200032a565b8260051b604051601f19603f83011681018181108482111715620003bf57620003bf6200032a565b604052938452858101830193838101925087851115620003dd575f80fd5b83870191505b848210156200040757620003f78262000356565b83529183019190830190620003e3565b979650505050505050565b5f805f805f60a0868803121562000427575f80fd5b855160208701519095506001600160401b038082111562000446575f80fd5b6200045489838a0162000368565b955060408801519150808211156200046a575f80fd5b50620004798882890162000368565b93505060608601516200048c816200033e565b60808701519092506200049f816200033e565b809150509295509295909350565b634e487b7160e01b5f52603260045260245ffd5b5f60018201620004df57634e487b7160e01b5f52601160045260245ffd5b5060010190565b6080516126c06200050d5f395f818161040201528181611124015261116401526126c05ff3fe6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212207a0bffd7acf8a1c68466909b51b363a979f9728750c0d1cf39cda1f88c34525d64736f6c634300081400335f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63fd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783",
+ "deployedBytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea26469706673582212207a0bffd7acf8a1c68466909b51b363a979f9728750c0d1cf39cda1f88c34525d64736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/compiled-contracts/SP1VerifierPlonk.json b/compiled-contracts/SP1VerifierPlonk.json
new file mode 100644
index 000000000..d0f2186f9
--- /dev/null
+++ b/compiled-contracts/SP1VerifierPlonk.json
@@ -0,0 +1,124 @@
+{
+ "_format": "hh-sol-artifact-1",
+ "contractName": "SP1VerifierPlonk",
+ "sourceName": "contracts/verifiers/v4.0.0-rc.3/SP1VerifierPlonk.sol",
+ "abi": [
+ {
+ "inputs": [],
+ "name": "InvalidProof",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "received",
+ "type": "bytes4"
+ },
+ {
+ "internalType": "bytes4",
+ "name": "expected",
+ "type": "bytes4"
+ }
+ ],
+ "name": "WrongVerifierSelector",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "VERIFIER_HASH",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "VERSION",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "proof",
+ "type": "bytes"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "public_inputs",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "Verify",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "success",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes",
+ "name": "publicValues",
+ "type": "bytes"
+ }
+ ],
+ "name": "hashPublicValues",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "publicValues",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "proofBytes",
+ "type": "bytes"
+ }
+ ],
+ "name": "verifyProof",
+ "outputs": [],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "bytecode": "0x608060405234801561000f575f80fd5b50612f768061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636b61d8e71161004d5780636b61d8e7146100b25780637e4f7a8a146100c5578063ffa1ad74146100e8575f80fd5b80632a5104361461006857806341493c601461009d575b5f80fd5b7f1b34fe11a637737f0c75c88241669dcf9ca3c03713659265b8241f398a2d286d5b6040519081526020015b60405180910390f35b6100b06100ab366004612c16565b610127565b005b61008a6100c0366004612c8a565b610335565b6100d86100d3366004612cc9565b6103b1565b6040519015158152602001610094565b604080518082018252600b81527f76342e302e302d72632e33000000000000000000000000000000000000000000602082015290516100949190612d5b565b5f6101356004828486612dc4565b61013e91612deb565b90507f1b34fe11a637737f0c75c88241669dcf9ca3c03713659265b8241f398a2d286d7f1b34fe11000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461020c576040517f988066a10000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000080841660048301528216602482015260440160405180910390fd5b5f6102178787610335565b6040805160028082526060820183529293505f929091602083019080368337019050509050885f1c815f8151811061025157610251612e33565b602002602001018181525050815f1c8160018151811061027357610273612e33565b60209081029190910101525f30637e4f7a8a610292886004818c612dc4565b856040518463ffffffff1660e01b81526004016102b193929190612e60565b602060405180830381865afa1580156102cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f09190612ef4565b905080610329576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050505050565b5f7f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b6002848460405161036b929190612f1a565b602060405180830381855afa158015610386573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906103a99190612f29565b169392505050565b5f60405161024081016103c384610853565b6103cd8585610866565b6103d6866108b5565b6103df876108cb565b5f6103eb86868a610a65565b90506103f681610d9b565b90506104028189610e01565b905061040e8189610e8f565b5060608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061046584630100000085612b66565b086101c084015250610478818587610efa565b61048382868a61126f565b91507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183086101a0840152506104ba9050611614565b6104c38661275a565b6104cc866126ab565b6104d5866122d2565b6104de86611dfe565b6104e786611b63565b6104f086611765565b61020001519050612bc9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f77726f6e67206e756d626572206f66207075626c696320696e707574730000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f72206d6f6420657870000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6572726f72206563206f7065726174696f6e00000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e707574732061726520626967676572207468616e207200000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f77726f6e672070726f6f662073697a65000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70656e696e677320626967676572207468616e2072000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6572726f722070616972696e67000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f722076657269667900000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6572726f722072616e646f6d2067656e206b7a670000000000000000000000006044820152606481fd5b60028114610863576108636104fc565b50565b5f5b818110156108b0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000833511156108a1576108a1610619565b60209290920191600101610868565b505050565b6103608181146108c7576108c7610678565b5050565b61018081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610901576109016106d7565b506101a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610938576109386106d7565b506101c081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561096f5761096f6106d7565b506101e081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156109a6576109a66106d7565b5061020081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156109dd576109dd6106d7565b5061026081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610a1457610a146106d7565b5061030081015f5b60018110156108b0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000082351115610a5657610a566106d7565b60209190910190600101610a1c565b5f60405161024081016467616d6d6181527f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f60208201527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e41960408201527f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c60608201527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b760808201527f1c81c1fbd342d416ee266b3a399beef9ffe2b51fff92b48d737d758d30d1241f60a08201527f0bc9e4b1e207ed79eb7d6ad861084410020a8d41d7eb6f57ca0868c4777cc34460c08201527f27c295f097038eb58f0f6d66aa345510a9e2ea3b5e9dc75f182376207134042860e08201527f1d5b1420aee936b0d295b5dcb8173a17c8a44b564509db9f95897cb73395a6be6101008201527f241e02c138aeebc8e2fe50b6d55271f1f682e8e368fb2d21c27324ff98f3ebdd6101208201527e31f7998d7bd4be4577b6bd0ccdc99ebaff0e4f82186584da8f600721cb29436101408201527f180091bdef5b48f8c60eaf427d872e6373841cf9920767c6a7af32dbfeaed0326101608201527f1481951fc49629d6c1a6218bc3cd3971d969ed4781de2cd4d3ba18909e187dc76101808201527f19634c7169f97677973fe29c865df785fc3859da2968bd9b21ac0d4f64834f216101a08201527f267532c6f9f01f4cadf688a9fa0a591f9acdc5820428d4fdc1b16733d56306e16101c08201527f0e19ddfd3a5601df62b35b4e93ccba750fd3b16db7c49c2b8ed111d84a0074346101e08201527f1b77a9dcbe482f7c56727522fa37c7c3c4814db3b53ca4b3a3ea488376b97d4f6102008201527f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e76102208201527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff610240820152610260810160208602808883379081019060c0808784375061030501905060208282601b820160025afa905080610d6557610d65610795565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182066040820152509392505050565b5f60405161024060405101636265746181528360208201526020816024601c840160025afa80610dcd57610dcd610795565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018206602082015250919050565b5f60405161024060405101606564616c7068618252602082018681526020810190506103208601600160400280828437928301929190910190506040610220870182375060208282601b850160025afa905080610e6057610e60610795565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181069091529392505050565b60405161024060405101637a657461815283602082015260c0808401604083013760208160e4601c840160025afa80610eca57610eca610795565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006606091909101525050565b5f60405160608101516101c0820151915085610f1881878585610f93565b5f92505f91505b85821015610f89577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001853582510992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018385086020958601959094506001929092019101610f1f565b5050509392505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c1183096001855f5b86811015611081577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103860882527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b8409925060209190910190600101610fdc565b5061108d818789611145565b5060019050855f5b8681101561113b577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001868551090982526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b84099250600101611095565b5050505050505050565b600183525f805b8381101561119a5781850151828401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990506020840193508084880152505060018101905061114c565b5060208103820191508084019350506111db6020840160027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001038551612b66565b5f5b838110156112685760208503945082517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018651840984527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909401939250506001016111dd565b5050505050565b5f60405160608101516101c0820151915061032084015f80611297896020850135853561141b565b91506112aa8962a59c328a0187876112e0565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840987089998505050505050505050565b5f61130c85857f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b612b66565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103840894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c11820990506113c5867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff87612b66565b94507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018482099695505050505050565b5f83525f602084015280604084015250806060830152505f6080820153603060818201535f60828201536042608382015360536084820153604260858201536032608682015360326087820153602d608882015360506089820153606c608a820153606f608b820153606e608c820153606b608d820153600b608e8201535f602082608f8460025afa806114b1576114b1610795565b8251600160208501536042602185015360536022850153604260238501536032602485015360326025850153602d602685015360506027850153606c6028850153606f6029850153606e602a850153606b602b850153600b602c850153602084602d8660025afa91508161152757611527610795565b8351186020840152600260408401536042604184015360536042840153604260438401536032604484015360326045840153602d604684015360506047840153606c6048840153606f6049840153606e604a840153606b604b840153600b604c84015360208301602081602d8360025afa915050806115a8576115a8610795565b507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017001000000000000000000000000000000008351099050602082015160801c7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089392505050565b604051610240604051016101c08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010360608501510861169a837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff83612b66565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c11820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282098451935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905082820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282099050806080840152505050565b60405161024081016101608201518152610180820151602082015261028083013560408201526102a08301356060820152610220830135608082015261024083013560a08201526102c083013560c08201526102e083013560e082015260608201516101008201526101e08201516101208201526020816101408360025afa806117f1576117f16107f4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182510690508160408101925061028085013581526102a0850135602082015261184183836102c0880184612acd565b61016084016118568484610220890184612acd565b610140850161186a84610260890183612b14565b7f1fa4be93b5e7f7e674d5059b63554fab99638b304ed8310e9fa44c281ac9b03b85527f1a01ae7fac6228e39d3cb5a5e71fd31160f3241e79a5f48ffb3737e6c389b7216020860152805160408087019182529095908160608160075afa9150816118d7576118d7610795565b60208101915081517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703825261190f868285866129c4565b50508360408501945061192c8560608801516102808a0184612a5b565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60608801510995507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186850993506119ac85856102c08a0184612acd565b6119b8858284856129c4565b50602082810180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470381528251865291810151908501527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408501527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608501527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808501527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0850152905160c0840152805160e08401527f22f1acbb03c4508760c2430af35865e7cdf9f3eb1224504fdcc3708ddb954a486101008401527f2a344fad01c2ed0ed73142ae1752429eaea515c6f3f6b941103cc21c2308e1cb6101208401527f159f15b842ba9c8449aa3268f981010d4c7142e5193473d80b464e964845c3f86101408401527f0efd30ac7b6f8d0d3ccbc2207587c2acbad1532dc0293f0d034cf8258cd428b361016084015292506108b090508160405160205f6101808460085afa80611b5557611b55610736565b505f51610200919091015250565b6040516102406040510160208101604082016101e084015180610160860160e08701518152610100870151610180880152610120870151610140880152611bae86835f8b0184612acd565b611bc1826101808a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611bf6868360408b0184612acd565b611c09826101a08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611c3e868360808b0184612acd565b611c51826101c08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f86527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e4198552611cc984838884612a86565b611cdc826101e08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c86527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b78552611d5484838884612a86565b611d67826102008a016101408a01612b14565b61030088017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184840992507f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e787527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff8652611de485848985612a86565b611df383826101408b01612b14565b505050505050505050565b6040516467616d6d616102408201908152606082015161026083015260e08201516102808301526101008201516102a083015260c0836102c08401377f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f6101408201527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e4196101608201527f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c610180808301919091527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b76101a0808401919091527f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e76101c0808501919091527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff6101e0808601919091526101208601516102008087019190915293870135610220860152918601356102408501528501356102608401528401356102808301528301356102a08201526102c081016103008401602081833750610260840135602091820152601b906102e5906101e085018285850160025afa9250505080611fb457611fb4610795565b506101e00180517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006905250565b604051610240604051017f27c295f097038eb58f0f6d66aa345510a9e2ea3b5e9dc75f182376207134042881527f1d5b1420aee936b0d295b5dcb8173a17c8a44b564509db9f95897cb73395a6be602082015261204d604082016101808501358360e08601612a30565b7f241e02c138aeebc8e2fe50b6d55271f1f682e8e368fb2d21c27324ff98f3ebdd81527e31f7998d7bd4be4577b6bd0ccdc99ebaff0e4f82186584da8f600721cb294360208201526120ac604082016101a08501358360e08601612a86565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840135610180850135097f180091bdef5b48f8c60eaf427d872e6373841cf9920767c6a7af32dbfeaed03282527f1481951fc49629d6c1a6218bc3cd3971d969ed4781de2cd4d3ba18909e187dc7602083015261213560408301828460e08701612a86565b507f19634c7169f97677973fe29c865df785fc3859da2968bd9b21ac0d4f64834f2181527f267532c6f9f01f4cadf688a9fa0a591f9acdc5820428d4fdc1b16733d56306e16020820152612196604082016101c08501358360e08601612a86565b7f0e19ddfd3a5601df62b35b4e93ccba750fd3b16db7c49c2b8ed111d84a00743481527f1b77a9dcbe482f7c56727522fa37c7c3c4814db3b53ca4b3a3ea488376b97d4f60208201526121f1604082018260e08501806129c4565b610300830161032084015f5b600181101561223d5781358452602082013560208501526122276040850184358660e08901612a86565b60209290920191604091909101906001016121fd565b5050507f1c81c1fbd342d416ee266b3a399beef9ffe2b51fff92b48d737d758d30d1241f81527f0bc9e4b1e207ed79eb7d6ad861084410020a8d41d7eb6f57ca0868c4777cc344602082015261229b60408201858360e08601612a86565b610220830135815261024083013560208201526122c060408201868360e08601612a86565b6112688160a0840160e08501806129c4565b6040516020810151604082015160608301515f8401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184610260880135097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e088013586097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180890135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161020089013587097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08a0135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600580097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001878a0998507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808c01358a0894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188860894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160058a0993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08c0135850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818a099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08b0135830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183850997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018289097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103985085890997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808a01518908975061032988828c611fe3565b6040516002630100000001610240604051016126cc81836060860151612b66565b91506126e18183610140870160a08701612a5b565b6126f481610100860160a08601806129fa565b612703818360a0860180612a30565b6127158160c0860160a08601806129fa565b61272c816101c085015160a0860160a08701612a30565b505060c00180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703905250565b6040515f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208301516101e08501350990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040830151820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180840135820890505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208401516102008601350990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040840151820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0850135820890505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160408501516101c08701350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f840151830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850135830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840151830860808401519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190810391508183087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036101209390930192909252505050565b8151845260208201516020850152825160408501526020830151606085015260408160808660065afa80611268576112686105ba565b8151845260208201516020850152823560408501526020830135606085015260408160808660065afa80611268576112686105ba565b815184526020820151602085015282604085015260408160608660075afa80611268576112686105ba565b813584526020820135602085015282604085015260408160608660075afa80611268576112686105ba565b815184526020820151602085015282604085015260408460608660075afa815160408601526020820151606086015260408260808760065afa1680611268576112686105ba565b813584526020820135602085015282604085015260408460608660075afa815160408601526020820151606086015260408260808760065afa1680611268576112686105ba565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838335097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181835108825250505050565b602083526020808401526020604084015280606084015250806080830152507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08201525f60208260c08460055afa80612bc357612bc361055b565b50505190565b949350505050565b5f8083601f840112612be1575f80fd5b50813567ffffffffffffffff811115612bf8575f80fd5b602083019150836020828501011115612c0f575f80fd5b9250929050565b5f805f805f60608688031215612c2a575f80fd5b85359450602086013567ffffffffffffffff80821115612c48575f80fd5b612c5489838a01612bd1565b90965094506040880135915080821115612c6c575f80fd5b50612c7988828901612bd1565b969995985093965092949392505050565b5f8060208385031215612c9b575f80fd5b823567ffffffffffffffff811115612cb1575f80fd5b612cbd85828601612bd1565b90969095509350505050565b5f805f8060408587031215612cdc575f80fd5b843567ffffffffffffffff80821115612cf3575f80fd5b612cff88838901612bd1565b90965094506020870135915080821115612d17575f80fd5b818701915087601f830112612d2a575f80fd5b813581811115612d38575f80fd5b8860208260051b8501011115612d4c575f80fd5b95989497505060200194505050565b5f6020808352835180828501525f5b81811015612d8657858101830151858201604001528201612d6a565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f8085851115612dd2575f80fd5b83861115612dde575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612e2b5780818660040360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011682016060810160206060858403018186015281865180845260808501915082880194505f93505b80841015612ee75784518252938201936001939093019290820190612ec7565b5098975050505050505050565b5f60208284031215612f04575f80fd5b81518015158114612f13575f80fd5b9392505050565b818382375f9101908152919050565b5f60208284031215612f39575f80fd5b505191905056fea2646970667358221220ac5a88251da015f24b0f25a0be73e96fb607cc2f726051134c52915549351e2664736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610064575f3560e01c80636b61d8e71161004d5780636b61d8e7146100b25780637e4f7a8a146100c5578063ffa1ad74146100e8575f80fd5b80632a5104361461006857806341493c601461009d575b5f80fd5b7f1b34fe11a637737f0c75c88241669dcf9ca3c03713659265b8241f398a2d286d5b6040519081526020015b60405180910390f35b6100b06100ab366004612c16565b610127565b005b61008a6100c0366004612c8a565b610335565b6100d86100d3366004612cc9565b6103b1565b6040519015158152602001610094565b604080518082018252600b81527f76342e302e302d72632e33000000000000000000000000000000000000000000602082015290516100949190612d5b565b5f6101356004828486612dc4565b61013e91612deb565b90507f1b34fe11a637737f0c75c88241669dcf9ca3c03713659265b8241f398a2d286d7f1b34fe11000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461020c576040517f988066a10000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000080841660048301528216602482015260440160405180910390fd5b5f6102178787610335565b6040805160028082526060820183529293505f929091602083019080368337019050509050885f1c815f8151811061025157610251612e33565b602002602001018181525050815f1c8160018151811061027357610273612e33565b60209081029190910101525f30637e4f7a8a610292886004818c612dc4565b856040518463ffffffff1660e01b81526004016102b193929190612e60565b602060405180830381865afa1580156102cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102f09190612ef4565b905080610329576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050505050505050565b5f7f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f1b6002848460405161036b929190612f1a565b602060405180830381855afa158015610386573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906103a99190612f29565b169392505050565b5f60405161024081016103c384610853565b6103cd8585610866565b6103d6866108b5565b6103df876108cb565b5f6103eb86868a610a65565b90506103f681610d9b565b90506104028189610e01565b905061040e8189610e8f565b5060608201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061046584630100000085612b66565b086101c084015250610478818587610efa565b61048382868a61126f565b91507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183086101a0840152506104ba9050611614565b6104c38661275a565b6104cc866126ab565b6104d5866122d2565b6104de86611dfe565b6104e786611b63565b6104f086611765565b61020001519050612bc9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f77726f6e67206e756d626572206f66207075626c696320696e707574730000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f72206d6f6420657870000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6572726f72206563206f7065726174696f6e00000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e707574732061726520626967676572207468616e207200000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f77726f6e672070726f6f662073697a65000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f70656e696e677320626967676572207468616e2072000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6572726f722070616972696e67000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6572726f722076657269667900000000000000000000000000000000000000006044820152606481fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6572726f722072616e646f6d2067656e206b7a670000000000000000000000006044820152606481fd5b60028114610863576108636104fc565b50565b5f5b818110156108b0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000833511156108a1576108a1610619565b60209290920191600101610868565b505050565b6103608181146108c7576108c7610678565b5050565b61018081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610901576109016106d7565b506101a081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610938576109386106d7565b506101c081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000008135111561096f5761096f6106d7565b506101e081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156109a6576109a66106d7565b5061020081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000813511156109dd576109dd6106d7565b5061026081017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000081351115610a1457610a146106d7565b5061030081015f5b60018110156108b0577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000082351115610a5657610a566106d7565b60209190910190600101610a1c565b5f60405161024081016467616d6d6181527f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f60208201527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e41960408201527f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c60608201527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b760808201527f1c81c1fbd342d416ee266b3a399beef9ffe2b51fff92b48d737d758d30d1241f60a08201527f0bc9e4b1e207ed79eb7d6ad861084410020a8d41d7eb6f57ca0868c4777cc34460c08201527f27c295f097038eb58f0f6d66aa345510a9e2ea3b5e9dc75f182376207134042860e08201527f1d5b1420aee936b0d295b5dcb8173a17c8a44b564509db9f95897cb73395a6be6101008201527f241e02c138aeebc8e2fe50b6d55271f1f682e8e368fb2d21c27324ff98f3ebdd6101208201527e31f7998d7bd4be4577b6bd0ccdc99ebaff0e4f82186584da8f600721cb29436101408201527f180091bdef5b48f8c60eaf427d872e6373841cf9920767c6a7af32dbfeaed0326101608201527f1481951fc49629d6c1a6218bc3cd3971d969ed4781de2cd4d3ba18909e187dc76101808201527f19634c7169f97677973fe29c865df785fc3859da2968bd9b21ac0d4f64834f216101a08201527f267532c6f9f01f4cadf688a9fa0a591f9acdc5820428d4fdc1b16733d56306e16101c08201527f0e19ddfd3a5601df62b35b4e93ccba750fd3b16db7c49c2b8ed111d84a0074346101e08201527f1b77a9dcbe482f7c56727522fa37c7c3c4814db3b53ca4b3a3ea488376b97d4f6102008201527f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e76102208201527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff610240820152610260810160208602808883379081019060c0808784375061030501905060208282601b820160025afa905080610d6557610d65610795565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182066040820152509392505050565b5f60405161024060405101636265746181528360208201526020816024601c840160025afa80610dcd57610dcd610795565b5080519250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018206602082015250919050565b5f60405161024060405101606564616c7068618252602082018681526020810190506103208601600160400280828437928301929190910190506040610220870182375060208282601b850160025afa905080610e6057610e60610795565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181069091529392505050565b60405161024060405101637a657461815283602082015260c0808401604083013760208160e4601c840160025afa80610eca57610eca610795565b50517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006606091909101525050565b5f60405160608101516101c0820151915085610f1881878585610f93565b5f92505f91505b85821015610f89577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001853582510992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018385086020958601959094506001929092019101610f1f565b5050509392505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c1183096001855f5b86811015611081577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103860882527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b8409925060209190910190600101610fdc565b5061108d818789611145565b5060019050855f5b8681101561113b577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001868551090982526020820191507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b84099250600101611095565b5050505050505050565b600183525f805b8381101561119a5781850151828401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181830990506020840193508084880152505060018101905061114c565b5060208103820191508084019350506111db6020840160027f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001038551612b66565b5f5b838110156112685760208503945082517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018651840984527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909401939250506001016111dd565b5050505050565b5f60405160608101516101c0820151915061032084015f80611297896020850135853561141b565b91506112aa8962a59c328a0187876112e0565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018082840987089998505050505050505050565b5f61130c85857f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b612b66565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001817f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000103840894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c11820990506113c5867f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff87612b66565b94507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018482099695505050505050565b5f83525f602084015280604084015250806060830152505f6080820153603060818201535f60828201536042608382015360536084820153604260858201536032608682015360326087820153602d608882015360506089820153606c608a820153606f608b820153606e608c820153606b608d820153600b608e8201535f602082608f8460025afa806114b1576114b1610795565b8251600160208501536042602185015360536022850153604260238501536032602485015360326025850153602d602685015360506027850153606c6028850153606f6029850153606e602a850153606b602b850153600b602c850153602084602d8660025afa91508161152757611527610795565b8351186020840152600260408401536042604184015360536042840153604260438401536032604484015360326045840153602d604684015360506047840153606c6048840153606f6049840153606e604a840153606b604b840153600b604c84015360208301602081602d8360025afa915050806115a8576115a8610795565b507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017001000000000000000000000000000000008351099050602082015160801c7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018183089392505050565b604051610240604051016101c08201517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010360608501510861169a837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff83612b66565b90507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c11820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282098451935091507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001905082820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018282099050806080840152505050565b60405161024081016101608201518152610180820151602082015261028083013560408201526102a08301356060820152610220830135608082015261024083013560a08201526102c083013560c08201526102e083013560e082015260608201516101008201526101e08201516101208201526020816101408360025afa806117f1576117f16107f4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182510690508160408101925061028085013581526102a0850135602082015261184183836102c0880184612acd565b61016084016118568484610220890184612acd565b610140850161186a84610260890183612b14565b7f1fa4be93b5e7f7e674d5059b63554fab99638b304ed8310e9fa44c281ac9b03b85527f1a01ae7fac6228e39d3cb5a5e71fd31160f3241e79a5f48ffb3737e6c389b7216020860152805160408087019182529095908160608160075afa9150816118d7576118d7610795565b60208101915081517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703825261190f868285866129c4565b50508360408501945061192c8560608801516102808a0184612a5b565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000017f0c9fabc7845d50d2852e2a0371c6441f145e0db82e8326961c25f1e3e32b045b60608801510995507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186850993506119ac85856102c08a0184612acd565b6119b8858284856129c4565b50602082810180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470381528251865291810151908501527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c260408501527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed60608501527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b60808501527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa60a0850152905160c0840152805160e08401527f22f1acbb03c4508760c2430af35865e7cdf9f3eb1224504fdcc3708ddb954a486101008401527f2a344fad01c2ed0ed73142ae1752429eaea515c6f3f6b941103cc21c2308e1cb6101208401527f159f15b842ba9c8449aa3268f981010d4c7142e5193473d80b464e964845c3f86101408401527f0efd30ac7b6f8d0d3ccbc2207587c2acbad1532dc0293f0d034cf8258cd428b361016084015292506108b090508160405160205f6101808460085afa80611b5557611b55610736565b505f51610200919091015250565b6040516102406040510160208101604082016101e084015180610160860160e08701518152610100870151610180880152610120870151610140880152611bae86835f8b0184612acd565b611bc1826101808a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611bf6868360408b0184612acd565b611c09826101a08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018383099150611c3e868360808b0184612acd565b611c51826101c08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f86527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e4198552611cc984838884612a86565b611cdc826101e08a016101408a01612b14565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183830991507f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c86527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b78552611d5484838884612a86565b611d67826102008a016101408a01612b14565b61030088017f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184840992507f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e787527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff8652611de485848985612a86565b611df383826101408b01612b14565b505050505050505050565b6040516467616d6d616102408201908152606082015161026083015260e08201516102808301526101008201516102a083015260c0836102c08401377f12a48c83bdc2bd4ee1f40afcc423cc0afc88de1ea9582ba24e270756ec8cce8f6101408201527f30435d8f96e055b4a6e430f453f5513c76ea9678640bce0c1e038c0d4722e4196101608201527f06639c1513f4b71307b9e27b59ba424e751e278c396e503d983083c829492c0c610180808301919091527f12ac9af6832ed9b17d99d5ddd50ceab75fb36d13181f468fa3efedc1416de3b76101a0808401919091527f239fd065b19f5fd14ab4226f6453ec6999736e4e4dfde3c66b68ffe2985627e76101c0808501919091527f292721d067d5f787ff7f0fd1d6eab321c598d1da89f668035dde31b300d24dff6101e0808601919091526101208601516102008087019190915293870135610220860152918601356102408501528501356102608401528401356102808301528301356102a08201526102c081016103008401602081833750610260840135602091820152601b906102e5906101e085018285850160025afa9250505080611fb457611fb4610795565b506101e00180517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019006905250565b604051610240604051017f27c295f097038eb58f0f6d66aa345510a9e2ea3b5e9dc75f182376207134042881527f1d5b1420aee936b0d295b5dcb8173a17c8a44b564509db9f95897cb73395a6be602082015261204d604082016101808501358360e08601612a30565b7f241e02c138aeebc8e2fe50b6d55271f1f682e8e368fb2d21c27324ff98f3ebdd81527e31f7998d7bd4be4577b6bd0ccdc99ebaff0e4f82186584da8f600721cb294360208201526120ac604082016101a08501358360e08601612a86565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840135610180850135097f180091bdef5b48f8c60eaf427d872e6373841cf9920767c6a7af32dbfeaed03282527f1481951fc49629d6c1a6218bc3cd3971d969ed4781de2cd4d3ba18909e187dc7602083015261213560408301828460e08701612a86565b507f19634c7169f97677973fe29c865df785fc3859da2968bd9b21ac0d4f64834f2181527f267532c6f9f01f4cadf688a9fa0a591f9acdc5820428d4fdc1b16733d56306e16020820152612196604082016101c08501358360e08601612a86565b7f0e19ddfd3a5601df62b35b4e93ccba750fd3b16db7c49c2b8ed111d84a00743481527f1b77a9dcbe482f7c56727522fa37c7c3c4814db3b53ca4b3a3ea488376b97d4f60208201526121f1604082018260e08501806129c4565b610300830161032084015f5b600181101561223d5781358452602082013560208501526122276040850184358660e08901612a86565b60209290920191604091909101906001016121fd565b5050507f1c81c1fbd342d416ee266b3a399beef9ffe2b51fff92b48d737d758d30d1241f81527f0bc9e4b1e207ed79eb7d6ad861084410020a8d41d7eb6f57ca0868c4777cc344602082015261229b60408201858360e08601612a86565b610220830135815261024083013560208201526122c060408201868360e08601612a86565b6112688160a0840160e08501806129c4565b6040516020810151604082015160608301515f8401517f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000184610260880135097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101e088013586097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180890135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000161020089013587097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08a0135820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000186820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018284097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000185820990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600580097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001878a0998507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101808c01358a0894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188860894507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160058a0993507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a08c0135850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000188850893507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001818a099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101c08b0135830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000187830891507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183850997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018289097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001908103985085890997507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160808a01518908975061032988828c611fe3565b6040516002630100000001610240604051016126cc81836060860151612b66565b91506126e18183610140870160a08701612a5b565b6126f481610100860160a08601806129fa565b612703818360a0860180612a30565b6127158160c0860160a08601806129fa565b61272c816101c085015160a0860160a08701612a30565b505060c00180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703905250565b6040515f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208301516101e08501350990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040830151820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610180840135820890505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160208401516102008601350990507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016040840151820890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0850135820890505f7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160408501516101c08701350890507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000182840992507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018184099250507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000015f840151830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001610260850135830991507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016101a0840151830860808401519092507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190810391508183087f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001036101209390930192909252505050565b8151845260208201516020850152825160408501526020830151606085015260408160808660065afa80611268576112686105ba565b8151845260208201516020850152823560408501526020830135606085015260408160808660065afa80611268576112686105ba565b815184526020820151602085015282604085015260408160608660075afa80611268576112686105ba565b813584526020820135602085015282604085015260408160608660075afa80611268576112686105ba565b815184526020820151602085015282604085015260408460608660075afa815160408601526020820151606086015260408260808760065afa1680611268576112686105ba565b813584526020820135602085015282604085015260408460608660075afa815160408601526020820151606086015260408260808760065afa1680611268576112686105ba565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838335097f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181835108825250505050565b602083526020808401526020604084015280606084015250806080830152507f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000160a08201525f60208260c08460055afa80612bc357612bc361055b565b50505190565b949350505050565b5f8083601f840112612be1575f80fd5b50813567ffffffffffffffff811115612bf8575f80fd5b602083019150836020828501011115612c0f575f80fd5b9250929050565b5f805f805f60608688031215612c2a575f80fd5b85359450602086013567ffffffffffffffff80821115612c48575f80fd5b612c5489838a01612bd1565b90965094506040880135915080821115612c6c575f80fd5b50612c7988828901612bd1565b969995985093965092949392505050565b5f8060208385031215612c9b575f80fd5b823567ffffffffffffffff811115612cb1575f80fd5b612cbd85828601612bd1565b90969095509350505050565b5f805f8060408587031215612cdc575f80fd5b843567ffffffffffffffff80821115612cf3575f80fd5b612cff88838901612bd1565b90965094506020870135915080821115612d17575f80fd5b818701915087601f830112612d2a575f80fd5b813581811115612d38575f80fd5b8860208260051b8501011115612d4c575f80fd5b95989497505060200194505050565b5f6020808352835180828501525f5b81811015612d8657858101830151858201604001528201612d6a565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f8085851115612dd2575f80fd5b83861115612dde575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612e2b5780818660040360031b1b83161692505b505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011682016060810160206060858403018186015281865180845260808501915082880194505f93505b80841015612ee75784518252938201936001939093019290820190612ec7565b5098975050505050505050565b5f60208284031215612f04575f80fd5b81518015158114612f13575f80fd5b9392505050565b818382375f9101908152919050565b5f60208284031215612f39575f80fd5b505191905056fea2646970667358221220ac5a88251da015f24b0f25a0be73e96fb607cc2f726051134c52915549351e2664736f6c63430008140033",
+ "linkReferences": {},
+ "deployedLinkReferences": {}
+}
diff --git a/compiled-contracts/VerifierRollupHelperMock.json b/compiled-contracts/VerifierRollupHelperMock.json
index 38a3b45b6..6e9659641 100644
--- a/compiled-contracts/VerifierRollupHelperMock.json
+++ b/compiled-contracts/VerifierRollupHelperMock.json
@@ -3,6 +3,29 @@
"contractName": "VerifierRollupHelperMock",
"sourceName": "contracts/mocks/VerifierRollupHelperMock.sol",
"abi": [
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "programVKey",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "publicValues",
+ "type": "bytes"
+ },
+ {
+ "internalType": "bytes",
+ "name": "proofBytes",
+ "type": "bytes"
+ }
+ ],
+ "name": "verifyProof",
+ "outputs": [],
+ "stateMutability": "pure",
+ "type": "function"
+ },
{
"inputs": [
{
@@ -28,8 +51,8 @@
"type": "function"
}
],
- "bytecode": "0x608060405234801561000f575f80fd5b5061014e8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220cd116917bfb356f793a2cef2885c134856a021af9708cf6e35bd8e053205c63b64736f6c63430008140033",
- "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610029575f3560e01c80639121da8a1461002d575b5f80fd5b61004361003b366004610084565b600192915050565b604051901515815260200160405180910390f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610097575f80fd5b6103008401858111156100a8575f80fd5b8493508561031f8601126100ba575f80fd5b604051602080820182811067ffffffffffffffff821117156100de576100de610057565b6040529286019281888511156100f2575f80fd5b5b8484101561010a57833581529281019281016100f3565b50949790965094505050505056fea2646970667358221220cd116917bfb356f793a2cef2885c134856a021af9708cf6e35bd8e053205c63b64736f6c63430008140033",
+ "bytecode": "0x608060405234801561000f575f80fd5b506102298061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c806341493c60146100385780639121da8a1461004f575b5f80fd5b61004d6100463660046100be565b5050505050565b005b61006561005d36600461015f565b600192915050565b604051901515815260200160405180910390f35b5f8083601f840112610089575f80fd5b50813567ffffffffffffffff8111156100a0575f80fd5b6020830191508360208285010111156100b7575f80fd5b9250929050565b5f805f805f606086880312156100d2575f80fd5b85359450602086013567ffffffffffffffff808211156100f0575f80fd5b6100fc89838a01610079565b90965094506040880135915080821115610114575f80fd5b5061012188828901610079565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610172575f80fd5b610300840185811115610183575f80fd5b8493508561031f860112610195575f80fd5b604051602080820182811067ffffffffffffffff821117156101b9576101b9610132565b6040529286019281888511156101cd575f80fd5b5b848410156101e557833581529281019281016101ce565b50949790965094505050505056fea264697066735822122038f5c9c95c4978a4f60bda4cf2b4c4a4e47b3482ea70dd8897f22c393d354bd964736f6c63430008140033",
+ "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610034575f3560e01c806341493c60146100385780639121da8a1461004f575b5f80fd5b61004d6100463660046100be565b5050505050565b005b61006561005d36600461015f565b600192915050565b604051901515815260200160405180910390f35b5f8083601f840112610089575f80fd5b50813567ffffffffffffffff8111156100a0575f80fd5b6020830191508360208285010111156100b7575f80fd5b9250929050565b5f805f805f606086880312156100d2575f80fd5b85359450602086013567ffffffffffffffff808211156100f0575f80fd5b6100fc89838a01610079565b90965094506040880135915080821115610114575f80fd5b5061012188828901610079565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80610320808486031215610172575f80fd5b610300840185811115610183575f80fd5b8493508561031f860112610195575f80fd5b604051602080820182811067ffffffffffffffff821117156101b9576101b9610132565b6040529286019281888511156101cd575f80fd5b5b848410156101e557833581529281019281016101ce565b50949790965094505050505056fea264697066735822122038f5c9c95c4978a4f60bda4cf2b4c4a4e47b3482ea70dd8897f22c393d354bd964736f6c63430008140033",
"linkReferences": {},
"deployedLinkReferences": {}
}
diff --git a/contracts/PolygonZkEVMBridge.sol b/contracts/PolygonZkEVMBridge.sol
index 1892f6b26..dadf50f12 100644
--- a/contracts/PolygonZkEVMBridge.sol
+++ b/contracts/PolygonZkEVMBridge.sol
@@ -139,7 +139,7 @@ contract PolygonZkEVMBridge is
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
- * @param token Token address, 0 address is reserved for ether
+ * @param token Token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not
* @param permitData Raw data of the call `permit` of the token
*/
@@ -306,7 +306,7 @@ contract PolygonZkEVMBridge is
* @param mainnetExitRoot Mainnet exit root
* @param rollupExitRoot Rollup exit root
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
@@ -483,7 +483,7 @@ contract PolygonZkEVMBridge is
* Since the metadata has relevance in the address deployed, this function will not return a valid
* wrapped address if the metadata provided is not the original one.
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param name Name of the token
* @param symbol Symbol of the token
* @param decimals Decimals of the token
@@ -520,7 +520,7 @@ contract PolygonZkEVMBridge is
/**
* @notice Returns the address of a wrapper using the token information if already exist
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
*/
function getTokenWrappedAddress(
uint32 originNetwork,
diff --git a/contracts/PolygonZkEVMGlobalExitRootL2.sol b/contracts/PolygonZkEVMGlobalExitRootL2.sol
index 1a7bbe33c..13d0603d9 100644
--- a/contracts/PolygonZkEVMGlobalExitRootL2.sol
+++ b/contracts/PolygonZkEVMGlobalExitRootL2.sol
@@ -27,6 +27,12 @@ contract PolygonZkEVMGlobalExitRootL2 is IBasePolygonZkEVMGlobalExitRoot {
// PolygonZkEVM Bridge address
address public immutable bridgeAddress;
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ */
+ uint256[50] private _gap;
+
/**
* @param _bridgeAddress PolygonZkEVMBridge contract address
*/
diff --git a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol
index 3d558f9b0..8a2920adb 100644
--- a/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol
+++ b/contracts/interfaces/IBasePolygonZkEVMGlobalExitRoot.sol
@@ -8,6 +8,31 @@ interface IBasePolygonZkEVMGlobalExitRoot {
*/
error OnlyAllowedContracts();
+ /**
+ * @dev Thrown when the caller is not the coinbase neither the globalExitRootUpdater
+ */
+ error OnlyGlobalExitRootUpdater();
+
+ /**
+ * @dev Thrown when the caller is not the globalExitRootRemover
+ */
+ error OnlyGlobalExitRootRemover();
+
+ /**
+ * @dev Thrown when trying to insert a global exit root that is already set
+ */
+ error GlobalExitRootAlreadySet();
+
+ /**
+ * @dev Thrown when trying to remove more global exit roots thank inserted
+ */
+ error NotEnoughGlobalExitRootsInserted();
+
+ /**
+ * @dev Thrown when trying to remove a ger that is not the last one
+ */
+ error NotLastInsertedGlobalExitRoot();
+
function updateExitRoot(bytes32 newRollupExitRoot) external;
function globalExitRootMap(
diff --git a/contracts/mocks/DepositContractMock.sol b/contracts/mocks/DepositContractMock.sol
index ff2ebfad2..404731b04 100644
--- a/contracts/mocks/DepositContractMock.sol
+++ b/contracts/mocks/DepositContractMock.sol
@@ -18,7 +18,7 @@ contract DepositContractMock is DepositContract {
* @notice Given the leaf data returns the leaf value
* @param leafType Leaf type
* @param originNetwork Origin Network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param destinationNetwork Destination network
* @param destinationAddress Destination address
* @param amount Amount of tokens
diff --git a/contracts/mocks/ERC20Decimals.sol b/contracts/mocks/ERC20Decimals.sol
new file mode 100644
index 000000000..d7c442752
--- /dev/null
+++ b/contracts/mocks/ERC20Decimals.sol
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity 0.8.20;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+contract ERC20Decimals is ERC20 {
+ uint8 private _decimals;
+
+ constructor(
+ string memory name,
+ string memory symbol,
+ address initialAccount,
+ uint256 initialBalance,
+ uint8 decimals_
+ ) payable ERC20(name, symbol) {
+ _mint(initialAccount, initialBalance);
+ NAME_HASH = keccak256(bytes(name));
+ _decimals = decimals_;
+ }
+
+ function decimals() public view virtual override returns (uint8) {
+ return _decimals;
+ }
+
+ function mint(address account, uint256 amount) public {
+ _mint(account, amount);
+ }
+
+ function burn(uint256 amount) public {
+ _burn(msg.sender, amount);
+ }
+
+ function transferInternal(address from, address to, uint256 value) public {
+ _transfer(from, to, value);
+ }
+
+ function approveInternal(
+ address owner,
+ address spender,
+ uint256 value
+ ) public {
+ _approve(owner, spender, value);
+ }
+
+ // erc20 permit
+ mapping(address => uint256) public nonces;
+
+ bytes32 public constant PERMIT_TYPEHASH =
+ keccak256(
+ "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
+ );
+
+ bytes32 public NAME_HASH;
+
+ // bytes32 public constant VERSION_HASH =
+ // keccak256("1")
+ bytes32 public constant VERSION_HASH =
+ 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;
+
+ // bytes32 public constant EIP712DOMAIN_HASH =
+ // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")
+ bytes32 public constant EIP712DOMAIN_HASH =
+ 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
+
+ function _validateSignedData(
+ address signer,
+ bytes32 encodeData,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) internal view {
+ bytes32 domainSeparator = keccak256(
+ abi.encode(
+ EIP712DOMAIN_HASH,
+ NAME_HASH,
+ VERSION_HASH,
+ getChainId(),
+ address(this)
+ )
+ );
+
+ bytes32 digest = keccak256(
+ abi.encodePacked("\x19\x01", domainSeparator, encodeData)
+ );
+ address recoveredAddress = ecrecover(digest, v, r, s);
+ // Explicitly disallow authorizations for address(0) as ecrecover returns address(0) on malformed messages
+ require(
+ recoveredAddress != address(0) && recoveredAddress == signer,
+ "HEZ::_validateSignedData: INVALID_SIGNATURE"
+ );
+ }
+
+ function getChainId() public view returns (uint256 chainId) {
+ assembly {
+ chainId := chainid()
+ }
+ }
+
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external {
+ require(deadline >= block.timestamp, "HEZ::permit: AUTH_EXPIRED");
+ bytes32 encodeData = keccak256(
+ abi.encode(
+ PERMIT_TYPEHASH,
+ owner,
+ spender,
+ value,
+ nonces[owner]++,
+ deadline
+ )
+ );
+ _validateSignedData(owner, encodeData, v, r, s);
+ _approve(owner, spender, value);
+ }
+
+ function DOMAIN_SEPARATOR() external view returns (bytes32) {
+ return
+ keccak256(
+ abi.encode(
+ EIP712DOMAIN_HASH,
+ NAME_HASH,
+ VERSION_HASH,
+ getChainId(),
+ address(this)
+ )
+ );
+ }
+}
diff --git a/contracts/mocks/PolygonZkEVMBridgeMock.sol b/contracts/mocks/PolygonZkEVMBridgeMock.sol
index 8a59ef889..fcb00505e 100644
--- a/contracts/mocks/PolygonZkEVMBridgeMock.sol
+++ b/contracts/mocks/PolygonZkEVMBridgeMock.sol
@@ -42,7 +42,7 @@ contract PolygonZkEVMBridgeMock is PolygonZkEVMBridge, OwnableUpgradeable {
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
- * @param token Token address, 0 address is reserved for ether
+ * @param token Token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param permitData Raw data of the call `permit` of the token
*/
function bridgeAsset(
diff --git a/contracts/mocks/VerifierRollupHelperMock.sol b/contracts/mocks/VerifierRollupHelperMock.sol
index 85e6b9192..4544d6efb 100644
--- a/contracts/mocks/VerifierRollupHelperMock.sol
+++ b/contracts/mocks/VerifierRollupHelperMock.sol
@@ -3,12 +3,20 @@
pragma solidity 0.8.20;
import "../interfaces/IVerifierRollup.sol";
+import "../v2/interfaces/ISP1Verifier.sol";
-contract VerifierRollupHelperMock is IVerifierRollup {
+contract VerifierRollupHelperMock is IVerifierRollup, ISP1Verifier {
function verifyProof(
bytes32[24] calldata proof,
uint256[1] memory pubSignals
) public pure override returns (bool) {
return true;
}
+
+ // SP1 interface
+ function verifyProof(
+ bytes32 programVKey,
+ bytes calldata publicValues,
+ bytes calldata proofBytes
+ ) public pure {}
}
diff --git a/contracts/token-wrapped-bridge-compiled/TokenWrappedBridge.sol b/contracts/token-wrapped-bridge-compiled/TokenWrappedBridge.sol
new file mode 100644
index 000000000..69a8bd13e
--- /dev/null
+++ b/contracts/token-wrapped-bridge-compiled/TokenWrappedBridge.sol
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: GPL-3.0
+// Implementation of permit based on https://github.com/WETH10/WETH10/blob/main/contracts/WETH10.sol
+pragma solidity 0.8.17;
+
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+
+// This contract contains the solidity code that compiles into the BASE_INIT_BYTECODE_WRAPPED_TOKEN constant on the PolygonZkEVMBridgeV2
+// This contract should remain untouched, even if it's not used directly as dependency. The main use is to verify on block explorers
+// and check the implementation.
+contract TokenWrappedBridge is ERC20 {
+ // Domain typehash
+ bytes32 public constant DOMAIN_TYPEHASH =
+ keccak256(
+ "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
+ );
+ // Permit typehash
+ bytes32 public constant PERMIT_TYPEHASH =
+ keccak256(
+ "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
+ );
+
+ // Version
+ string public constant VERSION = "1";
+
+ // Chain id on deployment
+ uint256 public immutable deploymentChainId;
+
+ // Domain separator calculated on deployment
+ bytes32 private immutable _DEPLOYMENT_DOMAIN_SEPARATOR;
+
+ // PolygonZkEVM Bridge address
+ address public immutable bridgeAddress;
+
+ // Decimals
+ uint8 private immutable _decimals;
+
+ // Permit nonces
+ mapping(address => uint256) public nonces;
+
+ modifier onlyBridge() {
+ require(
+ msg.sender == bridgeAddress,
+ "TokenWrapped::onlyBridge: Not PolygonZkEVMBridge"
+ );
+ _;
+ }
+
+ constructor(
+ string memory name,
+ string memory symbol,
+ uint8 __decimals
+ ) ERC20(name, symbol) {
+ bridgeAddress = msg.sender;
+ _decimals = __decimals;
+ deploymentChainId = block.chainid;
+ _DEPLOYMENT_DOMAIN_SEPARATOR = _calculateDomainSeparator(block.chainid);
+ }
+
+ function mint(address to, uint256 value) external onlyBridge {
+ _mint(to, value);
+ }
+
+ // Notice that is not require to approve wrapped tokens to use the bridge
+ function burn(address account, uint256 value) external onlyBridge {
+ _burn(account, value);
+ }
+
+ function decimals() public view virtual override returns (uint8) {
+ return _decimals;
+ }
+
+ // Permit relative functions
+ function permit(
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) external {
+ require(
+ block.timestamp <= deadline,
+ "TokenWrapped::permit: Expired permit"
+ );
+
+ bytes32 hashStruct = keccak256(
+ abi.encode(
+ PERMIT_TYPEHASH,
+ owner,
+ spender,
+ value,
+ nonces[owner]++,
+ deadline
+ )
+ );
+
+ bytes32 digest = keccak256(
+ abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct)
+ );
+
+ address signer = ecrecover(digest, v, r, s);
+ require(
+ signer != address(0) && signer == owner,
+ "TokenWrapped::permit: Invalid signature"
+ );
+
+ _approve(owner, spender, value);
+ }
+
+ /**
+ * @notice Calculate domain separator, given a chainID.
+ * @param chainId Current chainID
+ */
+ function _calculateDomainSeparator(
+ uint256 chainId
+ ) private view returns (bytes32) {
+ return
+ keccak256(
+ abi.encode(
+ DOMAIN_TYPEHASH,
+ keccak256(bytes(name())),
+ keccak256(bytes(VERSION)),
+ chainId,
+ address(this)
+ )
+ );
+ }
+
+ /// @dev Return the DOMAIN_SEPARATOR.
+ function DOMAIN_SEPARATOR() public view returns (bytes32) {
+ return
+ block.chainid == deploymentChainId
+ ? _DEPLOYMENT_DOMAIN_SEPARATOR
+ : _calculateDomainSeparator(block.chainid);
+ }
+}
diff --git a/contracts/v2/PolygonRollupManager.sol b/contracts/v2/PolygonRollupManager.sol
index dd8240b9c..d854b593f 100644
--- a/contracts/v2/PolygonRollupManager.sol
+++ b/contracts/v2/PolygonRollupManager.sol
@@ -2,7 +2,6 @@
pragma solidity 0.8.20;
-import "./interfaces/IPolygonRollupManager.sol";
import "./interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
import "../interfaces/IPolygonZkEVMBridge.sol";
import "./interfaces/IPolygonRollupBase.sol";
@@ -14,6 +13,9 @@ import "./lib/PolygonAccessControlUpgradeable.sol";
import "./lib/LegacyZKEVMStateVariables.sol";
import "./consensus/zkEVM/PolygonZkEVMExistentEtrog.sol";
import "./lib/PolygonConstantsBase.sol";
+import "./interfaces/IPolygonPessimisticConsensus.sol";
+import "./interfaces/ISP1Verifier.sol";
+import "./interfaces/IPolygonRollupManager.sol";
/**
* Contract responsible for managing rollups and the verification of their batches.
@@ -33,19 +35,23 @@ contract PolygonRollupManager is
/**
* @notice Struct which to store the rollup type data
* @param consensusImplementation Consensus implementation ( contains the consensus logic for the transaparent proxy)
- * @param verifier verifier
+ * @param address verifier
* @param forkID fork ID
- * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types
+ * @param rollupVerifierType Rollup compatibility ID, to check upgradability between rollup types
* @param obsolete Indicates if the rollup type is obsolete
* @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them
+ * @param programVKey Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
*/
struct RollupType {
address consensusImplementation;
- IVerifierRollup verifier;
+ address verifier;
uint64 forkID;
- uint8 rollupCompatibilityID;
+ /// @custom:oz-renamed-from rollupCompatibilityID
+ /// @custom:oz-retyped-from uint8
+ VerifierType rollupVerifierType;
bool obsolete;
bytes32 genesis;
+ bytes32 programVKey;
}
/**
@@ -57,41 +63,109 @@ contract PolygonRollupManager is
* @param forkID ForkID of the rollup
* @param batchNumToStateRoot State root mapping
* @param sequencedBatches Queue of batches that defines the virtual state
- * @param pendingStateTransitions Pending state mapping
+ * @param _legacyPendingStateTransitions Pending state mapping (deprecated)
* @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot
* @param lastBatchSequenced Last batch sent by the consensus contract
* @param lastVerifiedBatch Last batch verified
- * @param lastPendingState Last pending state
- * @param lastPendingStateConsolidated Last pending state consolidated
+ * @param _legacyLastPendingState Last pending state (deprecated)
+ * @param _legacyLastPendingStateConsolidated Last pending state consolidated (deprecated)
* @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade
* @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup
- * @param rollupCompatibilityID Rollup ID used for compatibility checks when upgrading
+ * @param rollupVerifierType Rollup ID used for compatibility checks when upgrading
+ * @param lastPessimisticRoot Pessimistic info, currently contains the local balance tree and the local nullifier tree hashed
+ * @param programVKey Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
*/
struct RollupData {
IPolygonRollupBase rollupContract;
uint64 chainID;
- IVerifierRollup verifier;
+ address verifier;
uint64 forkID;
mapping(uint64 batchNum => bytes32) batchNumToStateRoot;
mapping(uint64 batchNum => SequencedBatchData) sequencedBatches;
- mapping(uint256 pendingStateNum => PendingState) pendingStateTransitions;
+ /// @custom:oz-renamed-from pendingStateTransitions
+ mapping(uint256 pendingStateNum => PendingState) _legacyPendingStateTransitions;
+ bytes32 lastLocalExitRoot;
+ uint64 lastBatchSequenced;
+ uint64 lastVerifiedBatch;
+ /// @custom:oz-renamed-from lastPendingState
+ uint64 _legacyLastPendingState;
+ /// @custom:oz-renamed-from lastPendingStateConsolidated
+ uint64 _legacyLastPendingStateConsolidated;
+ uint64 lastVerifiedBatchBeforeUpgrade;
+ uint64 rollupTypeID;
+ /// @custom:oz-renamed-from rollupCompatibilityID
+ /// @custom:oz-retyped-from uint8
+ VerifierType rollupVerifierType;
+ bytes32 lastPessimisticRoot;
+ bytes32 programVKey;
+ }
+
+ /**
+ * @notice Struct to return all the necessary rollup info: VerifierType StateTransition
+ * @param rollupContract Rollup consensus contract, which manages everything
+ * related to sequencing transactions
+ * @param chainID Chain ID of the rollup
+ * @param verifier Verifier contract
+ * @param forkID ForkID of the rollup
+ * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot
+ * @param lastBatchSequenced Last batch sent by the consensus contract
+ * @param lastVerifiedBatch Last batch verified
+ * @param _legacyLastPendingState Last pending state (deprecated)
+ * @param _legacyLastPendingStateConsolidated Last pending state consolidated (deprecated)
+ * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade
+ * @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup
+ * @param rollupVerifierType Rollup ID used for compatibility checks when upgrading
+ */
+ struct RollupDataReturn {
+ IPolygonRollupBase rollupContract;
+ uint64 chainID;
+ address verifier;
+ uint64 forkID;
+ bytes32 lastLocalExitRoot;
+ uint64 lastBatchSequenced;
+ uint64 lastVerifiedBatch;
+ uint64 _legacyLastPendingState;
+ uint64 _legacyLastPendingStateConsolidated;
+ uint64 lastVerifiedBatchBeforeUpgrade;
+ uint64 rollupTypeID;
+ VerifierType rollupVerifierType;
+ }
+
+ /**
+ * @notice Struct which to store the rollup data of each chain
+ * @param rollupContract Rollup consensus contract, which manages everything
+ * related to sequencing transactions
+ * @param chainID Chain ID of the rollup
+ * @param verifier Verifier contract
+ * @param forkID ForkID of the rollup
+ * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot
+ * @param lastBatchSequenced Last batch sent by the consensus contract
+ * @param lastVerifiedBatch Last batch verified
+ * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade
+ * @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup
+ * @param rollupVerifierType Rollup ID used for compatibility checks when upgrading
+ * @param lastPessimisticRoot Pessimistic info, currently contains the local balance tree and the local nullifier tree hashed
+ * @param programVKey Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
+ */
+ struct RollupDataReturnV2 {
+ address rollupContract;
+ uint64 chainID;
+ address verifier;
+ uint64 forkID;
bytes32 lastLocalExitRoot;
uint64 lastBatchSequenced;
uint64 lastVerifiedBatch;
- uint64 lastPendingState;
- uint64 lastPendingStateConsolidated;
uint64 lastVerifiedBatchBeforeUpgrade;
uint64 rollupTypeID;
- uint8 rollupCompatibilityID;
+ VerifierType rollupVerifierType;
+ bytes32 lastPessimisticRoot;
+ bytes32 programVKey;
}
// Modulus zkSNARK
uint256 internal constant _RFIELD =
21888242871839275222246405745257275088548364400416034343698204186575808495617;
- // Max batch multiplier per verification
- uint256 internal constant _MAX_BATCH_MULTIPLIER = 12;
-
// Max batch fee value
uint256 internal constant _MAX_BATCH_FEE = 1000 ether;
@@ -157,6 +231,9 @@ contract PolygonRollupManager is
bytes32 internal constant _EMERGENCY_COUNCIL_ADMIN =
keccak256("EMERGENCY_COUNCIL_ADMIN");
+ // Current rollup manager version
+ string public constant ROLLUP_MANAGER_VERSION = "pessimistic";
+
// Global Exit Root address
IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
@@ -170,13 +247,15 @@ contract PolygonRollupManager is
uint32 public rollupTypeCount;
// Rollup type mapping
+ /// @custom:oz-retyped-from PolygonRollupManagerPrevious.RollupType
mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap;
// Number of rollups added, every new rollup will be assigned sequencially a new ID
uint32 public rollupCount;
// Rollups ID mapping
- mapping(uint32 rollupID => RollupData) public rollupIDToRollupData;
+ /// @custom:oz-retyped-from PolygonRollupManagerPrevious.RollupData
+ mapping(uint32 rollupID => RollupData) internal _rollupIDToRollupData;
// Rollups address mapping
mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID;
@@ -196,17 +275,21 @@ contract PolygonRollupManager is
// Trusted aggregator timeout, if a sequence is not verified in this time frame,
// everyone can verify that sequence
- uint64 public trustedAggregatorTimeout;
+ /// @custom:oz-renamed-from trustedAggregatorTimeout
+ uint64 internal __legacyTrustedAggregatorTimeout;
- // Once a pending state exceeds this timeout it can be consolidated
- uint64 public pendingStateTimeout;
+ // Once a pending state exceeds this timeout it can be consolidated (deprecated)
+ /// @custom:oz-renamed-from pendingStateTimeout
+ uint64 internal __legacyPendingStateTimeout;
// Time target of the verification of a batch
// Adaptively the batchFee will be updated to achieve this target
- uint64 public verifyBatchTimeTarget;
+ /// @custom:oz-renamed-from verifyBatchTimeTarget
+ uint64 internal __legacyVerifyBatchTimeTarget;
// Batch fee multiplier with 3 decimals that goes from 1000 - 1023
- uint16 public multiplierBatchFee;
+ /// @custom:oz-renamed-from multiplierBatchFee
+ uint16 internal __legacyMultiplierBatchFee;
// Current POL fee per batch sequenced
// note This variable is internal, since the view function getBatchFee is likely to be upgraded
@@ -223,9 +306,10 @@ contract PolygonRollupManager is
address consensusImplementation,
address verifier,
uint64 forkID,
- uint8 rollupCompatibilityID,
+ VerifierType rollupVerifierType,
bytes32 genesis,
- string description
+ string description,
+ bytes32 programVKey
);
/**
@@ -252,8 +336,9 @@ contract PolygonRollupManager is
uint64 forkID,
address rollupAddress,
uint64 chainID,
- uint8 rollupCompatibilityID,
- uint64 lastVerifiedBatchBeforeUpgrade
+ VerifierType rollupVerifierType,
+ uint64 lastVerifiedBatchBeforeUpgrade,
+ bytes32 programVKey
);
/**
@@ -270,17 +355,6 @@ contract PolygonRollupManager is
*/
event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced);
- /**
- * @dev Emitted when an aggregator verifies batches
- */
- event VerifyBatches(
- uint32 indexed rollupID,
- uint64 numBatch,
- bytes32 stateRoot,
- bytes32 exitRoot,
- address indexed aggregator
- );
-
/**
* @dev Emitted when the trusted aggregator verifies batches
*/
@@ -293,55 +367,14 @@ contract PolygonRollupManager is
);
/**
- * @dev Emitted when pending state is consolidated
- */
- event ConsolidatePendingState(
- uint32 indexed rollupID,
- uint64 numBatch,
- bytes32 stateRoot,
- bytes32 exitRoot,
- uint64 pendingStateNum
- );
-
- /**
- * @dev Emitted when is proved a different state given the same batches
- */
- event ProveNonDeterministicPendingState(
- bytes32 storedStateRoot,
- bytes32 provedStateRoot
- );
-
- /**
- * @dev Emitted when the trusted aggregator overrides pending state
+ * @dev Emitted when rollback batches
*/
- event OverridePendingState(
+ event RollbackBatches(
uint32 indexed rollupID,
- uint64 numBatch,
- bytes32 stateRoot,
- bytes32 exitRoot,
- address aggregator
+ uint64 indexed targetBatch,
+ bytes32 accInputHashToRollback
);
- /**
- * @dev Emitted when is updated the trusted aggregator timeout
- */
- event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout);
-
- /**
- * @dev Emitted when is updated the pending state timeout
- */
- event SetPendingStateTimeout(uint64 newPendingStateTimeout);
-
- /**
- * @dev Emitted when is updated the multiplier batch fee
- */
- event SetMultiplierBatchFee(uint16 newMultiplierBatchFee);
-
- /**
- * @dev Emitted when is updated the verify batch timeout
- */
- event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget);
-
/**
* @dev Emitted when is updated the trusted aggregator address
*/
@@ -352,6 +385,11 @@ contract PolygonRollupManager is
*/
event SetBatchFee(uint256 newBatchFee);
+ /**
+ * @dev Emitted when rollup manager is upgraded
+ */
+ event UpdateRollupManagerVersion(string rollupManagerVersion);
+
/**
* @param _globalExitRootManager Global exit root manager address
* @param _pol POL token address
@@ -371,113 +409,10 @@ contract PolygonRollupManager is
}
/**
- * @param trustedAggregator Trusted aggregator address
- * @param _pendingStateTimeout Pending state timeout
- * @param _trustedAggregatorTimeout Trusted aggregator timeout
- * @param admin Admin of the rollup manager
- * @param timelock Timelock address
- * @param emergencyCouncil Emergency council address
- * @param polygonZkEVM New deployed Polygon zkEVM which will be initialized wiht previous values
- * @param zkEVMVerifier Verifier of the new zkEVM deployed
- * @param zkEVMForkID Fork id of the new zkEVM deployed
- * @param zkEVMChainID Chain id of the new zkEVM deployed
+ * Initializer function to set new rollup manager version
*/
- function initialize(
- address trustedAggregator,
- uint64 _pendingStateTimeout,
- uint64 _trustedAggregatorTimeout,
- address admin,
- address timelock,
- address emergencyCouncil,
- PolygonZkEVMExistentEtrog polygonZkEVM,
- IVerifierRollup zkEVMVerifier,
- uint64 zkEVMForkID,
- uint64 zkEVMChainID
- ) external virtual reinitializer(2) {
- pendingStateTimeout = _pendingStateTimeout;
- trustedAggregatorTimeout = _trustedAggregatorTimeout;
-
- // Constant deployment variables
- _batchFee = 0.1 ether; // 0.1 POL
- verifyBatchTimeTarget = 30 minutes;
- multiplierBatchFee = 1002;
-
- // Initialize OZ contracts
- __AccessControl_init();
-
- // setup roles
-
- // trusted aggregator role
- _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator);
-
- // Timelock roles
- _setupRole(DEFAULT_ADMIN_ROLE, timelock);
- _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock);
- _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock);
-
- // note even this role can only update to an already added verifier/consensus
- // Could break the compatibility of them, changing the virtual state
- _setupRole(_UPDATE_ROLLUP_ROLE, timelock);
-
- // admin roles
- _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin);
- _setupRole(_CREATE_ROLLUP_ROLE, admin);
- _setupRole(_STOP_EMERGENCY_ROLE, admin);
- _setupRole(_TWEAK_PARAMETERS_ROLE, admin);
-
- // admin should be able to update the trusted aggregator address
- _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN);
- _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin);
- _setupRole(_SET_FEE_ROLE, admin);
-
- // Emergency council roles
- _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN);
- _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil);
- _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil);
-
- // Check last verified batch
- uint64 zkEVMLastBatchSequenced = _legacylastBatchSequenced;
- uint64 zkEVMLastVerifiedBatch = _legacyLastVerifiedBatch;
- if (zkEVMLastBatchSequenced != zkEVMLastVerifiedBatch) {
- revert AllzkEVMSequencedBatchesMustBeVerified();
- }
-
- // Initialize current zkEVM
- RollupData storage currentZkEVM = _addExistingRollup(
- IPolygonRollupBase(polygonZkEVM),
- zkEVMVerifier,
- zkEVMForkID,
- zkEVMChainID,
- 0, // Rollup compatibility ID is 0
- _legacyLastVerifiedBatch
- );
-
- // Copy variables from legacy
- currentZkEVM.batchNumToStateRoot[
- zkEVMLastVerifiedBatch
- ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch];
-
- // note previousLastBatchSequenced of the SequencedBatchData will be inconsistent,
- // since there will not be a previous sequence stored in the sequence mapping.
- // However since lastVerifiedBatch is equal to the lastBatchSequenced
- // won't affect in any case
- currentZkEVM.sequencedBatches[
- zkEVMLastBatchSequenced
- ] = _legacySequencedBatches[zkEVMLastBatchSequenced];
-
- currentZkEVM.lastBatchSequenced = zkEVMLastBatchSequenced;
- currentZkEVM.lastVerifiedBatch = zkEVMLastVerifiedBatch;
- currentZkEVM.lastVerifiedBatchBeforeUpgrade = zkEVMLastVerifiedBatch;
- // rollupType and rollupCompatibilityID will be both 0
-
- // Initialize polygon zkevm
- polygonZkEVM.initializeUpgrade(
- _legacyAdmin,
- _legacyTrustedSequencer,
- _legacyTrustedSequencerURL,
- _legacyNetworkName,
- _legacySequencedBatches[zkEVMLastBatchSequenced].accInputHash
- );
+ function initialize() external virtual reinitializer(3) {
+ emit UpdateRollupManagerVersion(ROLLUP_MANAGER_VERSION);
}
///////////////////////////////////////
@@ -489,36 +424,49 @@ contract PolygonRollupManager is
* @param consensusImplementation Consensus implementation
* @param verifier Verifier address
* @param forkID ForkID of the verifier
+ * @param rollupVerifierType rollup verifier type
* @param genesis Genesis block of the rollup
* @param description Description of the rollup type
+ * @param programVKey Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
*/
function addNewRollupType(
address consensusImplementation,
- IVerifierRollup verifier,
+ address verifier,
uint64 forkID,
- uint8 rollupCompatibilityID,
+ VerifierType rollupVerifierType,
bytes32 genesis,
- string memory description
+ string memory description,
+ bytes32 programVKey
) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) {
uint32 rollupTypeID = ++rollupTypeCount;
+ if (rollupVerifierType == VerifierType.Pessimistic) {
+ // No genesis on pessimistic rollups
+ if (genesis != bytes32(0)) revert InvalidRollupType();
+ } else {
+ // No programVKey on state transition rollups
+ if (programVKey != bytes32(0)) revert InvalidRollupType();
+ }
+
rollupTypeMap[rollupTypeID] = RollupType({
consensusImplementation: consensusImplementation,
verifier: verifier,
forkID: forkID,
- rollupCompatibilityID: rollupCompatibilityID,
+ rollupVerifierType: rollupVerifierType,
obsolete: false,
- genesis: genesis
+ genesis: genesis,
+ programVKey: programVKey
});
emit AddNewRollupType(
rollupTypeID,
consensusImplementation,
- address(verifier),
+ verifier,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesis,
- description
+ description,
+ programVKey
);
}
@@ -536,7 +484,7 @@ contract PolygonRollupManager is
// Check rollup type is not obsolete
RollupType storage currentRollupType = rollupTypeMap[rollupTypeID];
- if (currentRollupType.obsolete == true) {
+ if (currentRollupType.obsolete) {
revert RollupTypeObsolete();
}
@@ -548,7 +496,7 @@ contract PolygonRollupManager is
/**
* @notice Create a new rollup
* @param rollupTypeID Rollup type to deploy
- * @param chainID ChainID of the rollup, must be a new one
+ * @param chainID ChainID of the rollup, must be a new one, can not have more than 32 bits
* @param admin Admin of the new created rollup
* @param sequencer Sequencer of the new created rollup
* @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup
@@ -572,10 +520,16 @@ contract PolygonRollupManager is
// Check rollup type is not obsolete
RollupType storage rollupType = rollupTypeMap[rollupTypeID];
- if (rollupType.obsolete == true) {
+ if (rollupType.obsolete) {
revert RollupTypeObsolete();
}
+ // check chainID max value
+ // Currently we have this limitation by the circuit, might be removed in a future
+ if (chainID > type(uint32).max) {
+ revert ChainIDOutOfRange();
+ }
+
// Check chainID nullifier
if (chainIDToRollupID[chainID] != 0) {
revert ChainIDAlreadyExist();
@@ -598,7 +552,7 @@ contract PolygonRollupManager is
// Store rollup data
rollupAddressToID[rollupAddress] = rollupID;
- RollupData storage rollup = rollupIDToRollupData[rollupID];
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
rollup.rollupContract = IPolygonRollupBase(rollupAddress);
rollup.forkID = rollupType.forkID;
@@ -606,7 +560,8 @@ contract PolygonRollupManager is
rollup.chainID = chainID;
rollup.batchNumToStateRoot[0] = rollupType.genesis;
rollup.rollupTypeID = rollupTypeID;
- rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID;
+ rollup.rollupVerifierType = rollupType.rollupVerifierType;
+ rollup.programVKey = rollupType.programVKey;
emit CreateNewRollup(
rollupID,
@@ -634,56 +589,36 @@ contract PolygonRollupManager is
* @param verifier Verifier address, must be added before
* @param forkID Fork id of the added rollup
* @param chainID Chain id of the added rollup
- * @param genesis Genesis block for this rollup
- * @param rollupCompatibilityID Compatibility ID for the added rollup
+ * @param initRoot Genesis block for StateTransitionChains & localExitRoot for pessimistic chain
+ * @param rollupVerifierType Compatibility ID for the added rollup
+ * @param programVKey Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
*/
function addExistingRollup(
IPolygonRollupBase rollupAddress,
- IVerifierRollup verifier,
+ address verifier,
uint64 forkID,
uint64 chainID,
- bytes32 genesis,
- uint8 rollupCompatibilityID
+ bytes32 initRoot,
+ VerifierType rollupVerifierType,
+ bytes32 programVKey
) external onlyRole(_ADD_EXISTING_ROLLUP_ROLE) {
// Check chainID nullifier
if (chainIDToRollupID[chainID] != 0) {
revert ChainIDAlreadyExist();
}
+ // check chainID max value
+ // Currently we have this limitation by the circuit, might be removed in a future
+ if (chainID > type(uint32).max) {
+ revert ChainIDOutOfRange();
+ }
+
// Check if rollup address was already added
if (rollupAddressToID[address(rollupAddress)] != 0) {
revert RollupAddressAlreadyExist();
}
- RollupData storage rollup = _addExistingRollup(
- rollupAddress,
- verifier,
- forkID,
- chainID,
- rollupCompatibilityID,
- 0 // last verified batch it's always 0
- );
- rollup.batchNumToStateRoot[0] = genesis;
- }
-
- /**
- * @notice Add an already deployed rollup
- * note that this rollup does not follow any rollupType
- * @param rollupAddress Rollup address
- * @param verifier Verifier address, must be added before
- * @param forkID Fork id of the added rollup
- * @param chainID Chain id of the added rollup
- * @param rollupCompatibilityID Compatibility ID for the added rollup
- * @param lastVerifiedBatch Last verified batch before adding the rollup
- */
- function _addExistingRollup(
- IPolygonRollupBase rollupAddress,
- IVerifierRollup verifier,
- uint64 forkID,
- uint64 chainID,
- uint8 rollupCompatibilityID,
- uint64 lastVerifiedBatch
- ) internal returns (RollupData storage rollup) {
+ // Increment rollup count
uint32 rollupID = ++rollupCount;
// Set chainID nullifier
@@ -692,24 +627,66 @@ contract PolygonRollupManager is
// Store rollup data
rollupAddressToID[address(rollupAddress)] = rollupID;
- rollup = rollupIDToRollupData[rollupID];
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
rollup.rollupContract = rollupAddress;
rollup.forkID = forkID;
rollup.verifier = verifier;
rollup.chainID = chainID;
- rollup.rollupCompatibilityID = rollupCompatibilityID;
- // rollup type is 0, since it does not follow any rollup type
+ rollup.rollupVerifierType = rollupVerifierType;
+ // Check verifier type
+ if (rollupVerifierType == VerifierType.Pessimistic) {
+ rollup.programVKey = programVKey;
+ rollup.lastLocalExitRoot = initRoot;
+ } else {
+ rollup.batchNumToStateRoot[0] = initRoot;
+ }
+
+ // rollup type is 0, since it does not follow any rollup type
emit AddExistingRollup(
rollupID,
forkID,
address(rollupAddress),
chainID,
- rollupCompatibilityID,
- lastVerifiedBatch
+ rollupVerifierType,
+ 0,
+ programVKey
);
}
+ /**
+ * @notice Upgrade an existing rollup from the rollup admin address
+ * This address is able to udpate the rollup with more restrictions that the _UPDATE_ROLLUP_ROLE
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ */
+ function updateRollupByRollupAdmin(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID
+ ) external {
+ // Check admin of the network is msg.sender
+ if (IPolygonRollupBase(address(rollupContract)).admin() != msg.sender) {
+ revert OnlyRollupAdmin();
+ }
+
+ // Check all sequences are verified before upgrading
+ RollupData storage rollup = _rollupIDToRollupData[
+ rollupAddressToID[address(rollupContract)]
+ ];
+
+ // Check all sequenced batches are verified
+ if (rollup.lastBatchSequenced != rollup.lastVerifiedBatch) {
+ revert AllSequencedMustBeVerified();
+ }
+
+ // review sanity check
+ if (rollup.rollupTypeID >= newRollupTypeID) {
+ revert UpdateToOldRollupTypeID();
+ }
+
+ _updateRollup(rollupContract, newRollupTypeID, new bytes(0));
+ }
+
/**
* @notice Upgrade an existing rollup
* @param rollupContract Rollup consensus proxy address
@@ -719,8 +696,22 @@ contract PolygonRollupManager is
function updateRollup(
ITransparentUpgradeableProxy rollupContract,
uint32 newRollupTypeID,
- bytes calldata upgradeData
+ bytes memory upgradeData
) external onlyRole(_UPDATE_ROLLUP_ROLE) {
+ _updateRollup(rollupContract, newRollupTypeID, upgradeData);
+ }
+
+ /**
+ * @notice Upgrade an existing rollup
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ * @param upgradeData Upgrade data
+ */
+ function _updateRollup(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes memory upgradeData
+ ) internal {
// Check that rollup type exists
if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) {
revert RollupTypeDoesNotExist();
@@ -732,7 +723,7 @@ contract PolygonRollupManager is
revert RollupMustExist();
}
- RollupData storage rollup = rollupIDToRollupData[rollupID];
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
// The update must be to a new rollup type
if (rollup.rollupTypeID == newRollupTypeID) {
@@ -742,20 +733,19 @@ contract PolygonRollupManager is
RollupType storage newRollupType = rollupTypeMap[newRollupTypeID];
// Check rollup type is not obsolete
- if (newRollupType.obsolete == true) {
+ if (newRollupType.obsolete) {
revert RollupTypeObsolete();
}
- // Check compatibility of the rollups
- if (
- rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID
- ) {
+ // Check rollup types
+ if (rollup.rollupVerifierType != newRollupType.rollupVerifierType) {
revert UpdateNotCompatible();
}
// Update rollup parameters
rollup.verifier = newRollupType.verifier;
rollup.forkID = newRollupType.forkID;
+ rollup.programVKey = newRollupType.programVKey;
rollup.rollupTypeID = newRollupTypeID;
uint64 lastVerifiedBatch = getLastVerifiedBatch(rollupID);
@@ -770,6 +760,87 @@ contract PolygonRollupManager is
emit UpdateRollup(rollupID, newRollupTypeID, lastVerifiedBatch);
}
+ /**
+ * @notice Rollback batches of the target rollup
+ * Only applies to state transition rollups
+ * @param rollupContract Rollup consensus proxy address
+ * @param targetBatch Batch to rollback up to but not including this batch
+ */
+ function rollbackBatches(
+ IPolygonRollupBase rollupContract,
+ uint64 targetBatch
+ ) external {
+ // Check msg.sender has _UPDATE_ROLLUP_ROLE rol or is the admin of the network
+ if (
+ !hasRole(_UPDATE_ROLLUP_ROLE, msg.sender) &&
+ IPolygonRollupBase(address(rollupContract)).admin() != msg.sender
+ ) {
+ revert NotAllowedAddress();
+ }
+
+ // Check the rollup exists
+ uint32 rollupID = rollupAddressToID[address(rollupContract)];
+ if (rollupID == 0) {
+ revert RollupMustExist();
+ }
+
+ // Load rollup
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
+
+ if (rollup.rollupVerifierType != VerifierType.StateTransition) {
+ revert OnlyStateTransitionChains();
+ }
+
+ uint64 lastBatchSequenced = rollup.lastBatchSequenced;
+
+ // Batch to rollback should be already sequenced
+ if (
+ targetBatch >= lastBatchSequenced ||
+ targetBatch < rollup.lastVerifiedBatch
+ ) {
+ revert RollbackBatchIsNotValid();
+ }
+
+ uint64 currentBatch = lastBatchSequenced;
+
+ // delete sequence batches structs until the targetBatch
+ while (currentBatch != targetBatch) {
+ // Load previous end of sequence batch
+ uint64 previousBatch = rollup
+ .sequencedBatches[currentBatch]
+ .previousLastBatchSequenced;
+
+ // Batch to rollback must be end of a sequence
+ if (previousBatch < targetBatch) {
+ revert RollbackBatchIsNotEndOfSequence();
+ }
+
+ // delete sequence information
+ delete rollup.sequencedBatches[currentBatch];
+
+ // Update current batch for next iteration
+ currentBatch = previousBatch;
+ }
+
+ // Update last batch sequenced on rollup data
+ rollup.lastBatchSequenced = targetBatch;
+
+ // Update totalSequencedBatches
+ totalSequencedBatches -= lastBatchSequenced - targetBatch;
+
+ // Clean pending state if any
+ rollupContract.rollbackBatches(
+ targetBatch,
+ rollup.sequencedBatches[targetBatch].accInputHash
+ );
+
+ emit RollbackBatches(
+ rollupID,
+ targetBatch,
+ rollup.sequencedBatches[targetBatch].accInputHash
+ );
+ }
+
/////////////////////////////////////
// Sequence/Verify batches functions
////////////////////////////////////
@@ -794,7 +865,11 @@ contract PolygonRollupManager is
revert MustSequenceSomeBatch();
}
- RollupData storage rollup = rollupIDToRollupData[rollupID];
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
+
+ if (rollup.rollupVerifierType != VerifierType.StateTransition) {
+ revert OnlyStateTransitionChains();
+ }
// Update total sequence parameters
totalSequencedBatches += newSequencedBatches;
@@ -811,18 +886,15 @@ contract PolygonRollupManager is
previousLastBatchSequenced: previousLastBatchSequenced
});
- // Consolidate pending state if possible
- _tryConsolidatePendingState(rollup);
-
emit OnSequenceBatches(rollupID, newLastBatchSequenced);
return newLastBatchSequenced;
}
/**
- * @notice Allows an aggregator to verify multiple batches
+ * @notice Allows a trusted aggregator to verify multiple batches
* @param rollupID Rollup identifier
- * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used (deprecated)
* @param initNumBatch Batch which the aggregator starts the verification
* @param finalNewBatch Last batch aggregator intends to verify
* @param newLocalExitRoot New local exit root once the batch is processed
@@ -830,7 +902,7 @@ contract PolygonRollupManager is
* @param beneficiary Address that will receive the verification reward
* @param proof Fflonk proof
*/
- function verifyBatches(
+ function verifyBatchesTrustedAggregator(
uint32 rollupID,
uint64 pendingStateNum,
uint64 initNumBatch,
@@ -839,102 +911,21 @@ contract PolygonRollupManager is
bytes32 newStateRoot,
address beneficiary,
bytes32[24] calldata proof
- ) external ifNotEmergencyState {
- RollupData storage rollup = rollupIDToRollupData[rollupID];
-
- // Check if the trusted aggregator timeout expired,
- // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0
- if (
- rollup.sequencedBatches[finalNewBatch].sequencedTimestamp +
- trustedAggregatorTimeout >
- block.timestamp
- ) {
- revert TrustedAggregatorTimeoutNotExpired();
- }
-
- if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) {
- revert ExceedMaxVerifyBatches();
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ // Pending state became deprecated,
+ // It's still there just to have backwards compatibility interface
+ if (pendingStateNum != 0) {
+ revert PendingStateNumExist();
}
- _verifyAndRewardBatches(
- rollup,
- pendingStateNum,
- initNumBatch,
- finalNewBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary,
- proof
- );
-
- // Update batch fees
- _updateBatchFee(rollup, finalNewBatch);
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
- if (pendingStateTimeout == 0) {
- // Consolidate state
- rollup.lastVerifiedBatch = finalNewBatch;
- rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
- rollup.lastLocalExitRoot = newLocalExitRoot;
-
- // Clean pending state if any
- if (rollup.lastPendingState > 0) {
- rollup.lastPendingState = 0;
- rollup.lastPendingStateConsolidated = 0;
- }
-
- // Interact with globalExitRootManager
- globalExitRootManager.updateExitRoot(getRollupExitRoot());
- } else {
- // Consolidate pending state if possible
- _tryConsolidatePendingState(rollup);
-
- // Update pending state
- rollup.lastPendingState++;
- rollup.pendingStateTransitions[
- rollup.lastPendingState
- ] = PendingState({
- timestamp: uint64(block.timestamp),
- lastVerifiedBatch: finalNewBatch,
- exitRoot: newLocalExitRoot,
- stateRoot: newStateRoot
- });
+ if (rollup.rollupVerifierType != VerifierType.StateTransition) {
+ revert OnlyStateTransitionChains();
}
- emit VerifyBatches(
- rollupID,
- finalNewBatch,
- newStateRoot,
- newLocalExitRoot,
- msg.sender
- );
- }
-
- /**
- * @notice Allows a trusted aggregator to verify multiple batches
- * @param rollupID Rollup identifier
- * @param pendingStateNum Init pending state, 0 if consolidated state is used
- * @param initNumBatch Batch which the aggregator starts the verification
- * @param finalNewBatch Last batch aggregator intends to verify
- * @param newLocalExitRoot New local exit root once the batch is processed
- * @param newStateRoot New State root once the batch is processed
- * @param beneficiary Address that will receive the verification reward
- * @param proof Fflonk proof
- */
- function verifyBatchesTrustedAggregator(
- uint32 rollupID,
- uint64 pendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- address beneficiary,
- bytes32[24] calldata proof
- ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
- RollupData storage rollup = rollupIDToRollupData[rollupID];
-
_verifyAndRewardBatches(
rollup,
- pendingStateNum,
initNumBatch,
finalNewBatch,
newLocalExitRoot,
@@ -948,12 +939,6 @@ contract PolygonRollupManager is
rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
rollup.lastLocalExitRoot = newLocalExitRoot;
- // Clean pending state if any
- if (rollup.lastPendingState > 0) {
- rollup.lastPendingState = 0;
- rollup.lastPendingStateConsolidated = 0;
- }
-
// Interact with globalExitRootManager
globalExitRootManager.updateExitRoot(getRollupExitRoot());
@@ -969,7 +954,6 @@ contract PolygonRollupManager is
/**
* @notice Verify and reward batches internal function
* @param rollup Rollup Data storage pointer that will be used to the verification
- * @param pendingStateNum Init pending state, 0 if consolidated state is used
* @param initNumBatch Batch which the aggregator starts the verification
* @param finalNewBatch Last batch aggregator intends to verify
* @param newLocalExitRoot New local exit root once the batch is processed
@@ -979,7 +963,6 @@ contract PolygonRollupManager is
*/
function _verifyAndRewardBatches(
RollupData storage rollup,
- uint64 pendingStateNum,
uint64 initNumBatch,
uint64 finalNewBatch,
bytes32 newLocalExitRoot,
@@ -988,43 +971,23 @@ contract PolygonRollupManager is
bytes32[24] calldata proof
) internal virtual {
bytes32 oldStateRoot;
+
uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
revert InitBatchMustMatchCurrentForkID();
}
- // Use pending state if specified, otherwise use consolidated state
- if (pendingStateNum != 0) {
- // Check that pending state exist
- // Already consolidated pending states can be used aswell
- if (pendingStateNum > rollup.lastPendingState) {
- revert PendingStateDoesNotExist();
- }
+ // Use consolidated state
+ oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
- // Check choosen pending state
- PendingState storage currentPendingState = rollup
- .pendingStateTransitions[pendingStateNum];
-
- // Get oldStateRoot from pending batch
- oldStateRoot = currentPendingState.stateRoot;
-
- // Check initNumBatch matches the pending state
- if (initNumBatch != currentPendingState.lastVerifiedBatch) {
- revert InitNumBatchDoesNotMatchPendingState();
- }
- } else {
- // Use consolidated state
- oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
-
- if (oldStateRoot == bytes32(0)) {
- revert OldStateRootDoesNotExist();
- }
+ if (oldStateRoot == bytes32(0)) {
+ revert OldStateRootDoesNotExist();
+ }
- // Check initNumBatch is inside the range, sanity check
- if (initNumBatch > currentLastVerifiedBatch) {
- revert InitNumBatchAboveLastVerifiedBatch();
- }
+ // Check initNumBatch is inside the range, sanity check
+ if (initNumBatch > currentLastVerifiedBatch) {
+ revert InitNumBatchAboveLastVerifiedBatch();
}
// Check final batch
@@ -1046,7 +1009,9 @@ contract PolygonRollupManager is
uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
// Verify proof
- if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
+ if (
+ !IVerifierRollup(rollup.verifier).verifyProof(proof, [inputSnark])
+ ) {
revert InvalidProof();
}
@@ -1071,408 +1036,74 @@ contract PolygonRollupManager is
}
/**
- * @notice Internal function to consolidate the state automatically once sequence or verify batches are called
- * It tries to consolidate the first and the middle pending state in the queue
- */
- function _tryConsolidatePendingState(RollupData storage rollup) internal {
- // Check if there's any state to consolidate
- if (rollup.lastPendingState > rollup.lastPendingStateConsolidated) {
- // Check if it's possible to consolidate the next pending state
- uint64 nextPendingState = rollup.lastPendingStateConsolidated + 1;
- if (_isPendingStateConsolidable(rollup, nextPendingState)) {
- // Check middle pending state ( binary search of 1 step)
- uint64 middlePendingState = nextPendingState +
- (rollup.lastPendingState - nextPendingState) /
- 2;
-
- // Try to consolidate it, and if not, consolidate the nextPendingState
- if (_isPendingStateConsolidable(rollup, middlePendingState)) {
- _consolidatePendingState(rollup, middlePendingState);
- } else {
- _consolidatePendingState(rollup, nextPendingState);
- }
- }
- }
- }
-
- /**
- * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout
- * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
+ * @notice Allows a trusted aggregator to verify pessimistic proof
* @param rollupID Rollup identifier
- * @param pendingStateNum Pending state to consolidate
+ * @param l1InfoTreeLeafCount Count of the L1InfoTree leaf that will be used to verify imported bridge exits
+ * @param newLocalExitRoot New local exit root
+ * @param newPessimisticRoot New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+ * @param proof SP1 proof (Plonk)
*/
- function consolidatePendingState(
+ function verifyPessimisticTrustedAggregator(
uint32 rollupID,
- uint64 pendingStateNum
- ) external {
- RollupData storage rollup = rollupIDToRollupData[rollupID];
- // Check if pending state can be consolidated
- // If trusted aggregator is the sender, do not check the timeout or the emergency state
- if (!hasRole(_TRUSTED_AGGREGATOR_ROLE, msg.sender)) {
- if (isEmergencyState) {
- revert OnlyNotEmergencyState();
- }
-
- if (!_isPendingStateConsolidable(rollup, pendingStateNum)) {
- revert PendingStateNotConsolidable();
- }
- }
- _consolidatePendingState(rollup, pendingStateNum);
- }
+ uint32 l1InfoTreeLeafCount,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot,
+ bytes calldata proof
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
- /**
- * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
- * @param rollup Rollup data storage pointer
- * @param pendingStateNum Pending state to consolidate
- */
- function _consolidatePendingState(
- RollupData storage rollup,
- uint64 pendingStateNum
- ) internal {
- // Check if pendingStateNum is in correct range
- // - not consolidated (implicity checks that is not 0)
- // - exist ( has been added)
- if (
- pendingStateNum <= rollup.lastPendingStateConsolidated ||
- pendingStateNum > rollup.lastPendingState
- ) {
- revert PendingStateInvalid();
+ // Only for pessimistic verifiers
+ if (rollup.rollupVerifierType != VerifierType.Pessimistic) {
+ revert OnlyChainsWithPessimisticProofs();
}
- PendingState storage currentPendingState = rollup
- .pendingStateTransitions[pendingStateNum];
-
- // Update state
- uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch;
- rollup.lastVerifiedBatch = newLastVerifiedBatch;
- rollup.batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState
- .stateRoot;
- rollup.lastLocalExitRoot = currentPendingState.exitRoot;
-
- // Update pending state
- rollup.lastPendingStateConsolidated = pendingStateNum;
-
- // Interact with globalExitRootManager
- globalExitRootManager.updateExitRoot(getRollupExitRoot());
-
- emit ConsolidatePendingState(
- rollupAddressToID[address(rollup.rollupContract)],
- newLastVerifiedBatch,
- currentPendingState.stateRoot,
- currentPendingState.exitRoot,
- pendingStateNum
+ // Check l1InfoTreeLeafCount has a valid l1InfoTreeRoot
+ bytes32 l1InfoRoot = globalExitRootManager.l1InfoRootMap(
+ l1InfoTreeLeafCount
);
- }
-
- /////////////////////////////////
- // Soundness protection functions
- /////////////////////////////////
- /**
- * @notice Allows the trusted aggregator to override the pending state
- * if it's possible to prove a different state root given the same batches
- * @param rollupID Rollup identifier
- * @param initPendingStateNum Init pending state, 0 if consolidated state is used
- * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
- * @param initNumBatch Batch which the aggregator starts the verification
- * @param finalNewBatch Last batch aggregator intends to verify
- * @param newLocalExitRoot New local exit root once the batch is processed
- * @param newStateRoot New State root once the batch is processed
- * @param proof Fflonk proof
- */
- function overridePendingState(
- uint32 rollupID,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] calldata proof
- ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
- RollupData storage rollup = rollupIDToRollupData[rollupID];
+ if (l1InfoRoot == bytes32(0)) {
+ revert L1InfoTreeLeafCountInvalid();
+ }
- _proveDistinctPendingState(
+ bytes memory inputPessimisticBytes = _getInputPessimisticBytes(
+ rollupID,
rollup,
- initPendingStateNum,
- finalPendingStateNum,
- initNumBatch,
- finalNewBatch,
+ l1InfoRoot,
newLocalExitRoot,
- newStateRoot,
+ newPessimisticRoot
+ );
+
+ // Verify proof
+ ISP1Verifier(rollup.verifier).verifyProof(
+ rollup.programVKey,
+ inputPessimisticBytes,
proof
);
+ // TODO: Since there are no batches we could have either:
+ // A pool of POL for pessimistic, or make the fee system offchain, since there are already a
+ // dependency with the trusted aggregator ( or pessimistic aggregator)
+
+ // Update aggregation parameters
+ lastAggregationTimestamp = uint64(block.timestamp);
// Consolidate state
- rollup.lastVerifiedBatch = finalNewBatch;
- rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
rollup.lastLocalExitRoot = newLocalExitRoot;
-
- // Clean pending state if any
- if (rollup.lastPendingState > 0) {
- rollup.lastPendingState = 0;
- rollup.lastPendingStateConsolidated = 0;
- }
+ rollup.lastPessimisticRoot = newPessimisticRoot;
// Interact with globalExitRootManager
globalExitRootManager.updateExitRoot(getRollupExitRoot());
- // Update trusted aggregator timeout to max
- trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT;
-
- emit OverridePendingState(
+ // Same event as verifyBatches to support current bridge service to synchronize everything
+ emit VerifyBatchesTrustedAggregator(
rollupID,
- finalNewBatch,
- newStateRoot,
+ 0, // final batch: does not apply in pessimistic
+ bytes32(0), // new state root: does not apply in pessimistic
newLocalExitRoot,
msg.sender
);
}
- /**
- * @notice Allows activate the emergency state if its possible to prove a different state root given the same batches
- * @param rollupID Rollup identifier
- * @param initPendingStateNum Init pending state, 0 if consolidated state is used
- * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
- * @param initNumBatch Batch which the aggregator starts the verification
- * @param finalNewBatch Last batch aggregator intends to verify
- * @param newLocalExitRoot New local exit root once the batch is processed
- * @param newStateRoot New State root once the batch is processed
- * @param proof Fflonk proof
- */
- function proveNonDeterministicPendingState(
- uint32 rollupID,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] calldata proof
- ) external ifNotEmergencyState {
- RollupData storage rollup = rollupIDToRollupData[rollupID];
-
- _proveDistinctPendingState(
- rollup,
- initPendingStateNum,
- finalPendingStateNum,
- initNumBatch,
- finalNewBatch,
- newLocalExitRoot,
- newStateRoot,
- proof
- );
-
- emit ProveNonDeterministicPendingState(
- rollup.pendingStateTransitions[finalPendingStateNum].stateRoot,
- newStateRoot
- );
-
- // Activate emergency state
- _activateEmergencyState();
- }
-
- /**
- * @notice Internal function that proves a different state root given the same batches to verify
- * @param rollup Rollup Data struct that will be checked
- * @param initPendingStateNum Init pending state, 0 if consolidated state is used
- * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
- * @param initNumBatch Batch which the aggregator starts the verification
- * @param finalNewBatch Last batch aggregator intends to verify
- * @param newLocalExitRoot New local exit root once the batch is processed
- * @param newStateRoot New State root once the batch is processed
- * @param proof Fflonk proof
- */
- function _proveDistinctPendingState(
- RollupData storage rollup,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] calldata proof
- ) internal view virtual {
- bytes32 oldStateRoot;
-
- if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
- revert InitBatchMustMatchCurrentForkID();
- }
-
- // Use pending state if specified, otherwise use consolidated state
- if (initPendingStateNum != 0) {
- // Check that pending state exist
- // Already consolidated pending states can be used aswell
- if (initPendingStateNum > rollup.lastPendingState) {
- revert PendingStateDoesNotExist();
- }
-
- // Check choosen pending state
- PendingState storage initPendingState = rollup
- .pendingStateTransitions[initPendingStateNum];
-
- // Get oldStateRoot from init pending state
- oldStateRoot = initPendingState.stateRoot;
-
- // Check initNumBatch matches the init pending state
- if (initNumBatch != initPendingState.lastVerifiedBatch) {
- revert InitNumBatchDoesNotMatchPendingState();
- }
- } else {
- // Use consolidated state
- oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
- if (oldStateRoot == bytes32(0)) {
- revert OldStateRootDoesNotExist();
- }
-
- // Check initNumBatch is inside the range, sanity check
- if (initNumBatch > rollup.lastVerifiedBatch) {
- revert InitNumBatchAboveLastVerifiedBatch();
- }
- }
-
- // Assert final pending state num is in correct range
- // - exist ( has been added)
- // - bigger than the initPendingstate
- // - not consolidated
- if (
- finalPendingStateNum > rollup.lastPendingState ||
- finalPendingStateNum <= initPendingStateNum ||
- finalPendingStateNum <= rollup.lastPendingStateConsolidated
- ) {
- revert FinalPendingStateNumInvalid();
- }
-
- // Check final num batch
- if (
- finalNewBatch !=
- rollup
- .pendingStateTransitions[finalPendingStateNum]
- .lastVerifiedBatch
- ) {
- revert FinalNumBatchDoesNotMatchPendingState();
- }
-
- // Get snark bytes
- bytes memory snarkHashBytes = _getInputSnarkBytes(
- rollup,
- initNumBatch,
- finalNewBatch,
- newLocalExitRoot,
- oldStateRoot,
- newStateRoot
- );
-
- // Calulate the snark input
- uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
-
- // Verify proof
- if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
- revert InvalidProof();
- }
-
- if (
- rollup.pendingStateTransitions[finalPendingStateNum].stateRoot ==
- newStateRoot
- ) {
- revert StoredRootMustBeDifferentThanNewRoot();
- }
- }
-
- /**
- * @notice Function to update the batch fee based on the new verified batches
- * The batch fee will not be updated when the trusted aggregator verifies batches
- * @param newLastVerifiedBatch New last verified batch
- */
- function _updateBatchFee(
- RollupData storage rollup,
- uint64 newLastVerifiedBatch
- ) internal {
- uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
- uint64 currentBatch = newLastVerifiedBatch;
-
- uint256 totalBatchesAboveTarget;
- uint256 newBatchesVerified = newLastVerifiedBatch -
- currentLastVerifiedBatch;
-
- uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget;
-
- while (currentBatch != currentLastVerifiedBatch) {
- // Load sequenced batchdata
- SequencedBatchData storage currentSequencedBatchData = rollup
- .sequencedBatches[currentBatch];
-
- // Check if timestamp is below the verifyBatchTimeTarget
- if (
- targetTimestamp < currentSequencedBatchData.sequencedTimestamp
- ) {
- // update currentBatch
- currentBatch = currentSequencedBatchData
- .previousLastBatchSequenced;
- } else {
- // The rest of batches will be above
- totalBatchesAboveTarget =
- currentBatch -
- currentLastVerifiedBatch;
- break;
- }
- }
-
- uint256 totalBatchesBelowTarget = newBatchesVerified -
- totalBatchesAboveTarget;
-
- // _MAX_BATCH_FEE --> (< 70 bits)
- // multiplierBatchFee --> (< 10 bits)
- // _MAX_BATCH_MULTIPLIER = 12
- // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits)
- // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)-->
- // (< 70 bits) * (< 128 bits) = < 256 bits
-
- // Since all the following operations cannot overflow, we can optimize this operations with unchecked
- unchecked {
- if (totalBatchesBelowTarget < totalBatchesAboveTarget) {
- // There are more batches above target, fee is multiplied
- uint256 diffBatches = totalBatchesAboveTarget -
- totalBatchesBelowTarget;
-
- diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
- ? _MAX_BATCH_MULTIPLIER
- : diffBatches;
-
- // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
- _batchFee =
- (_batchFee * (uint256(multiplierBatchFee) ** diffBatches)) /
- (uint256(1000) ** diffBatches);
- } else {
- // There are more batches below target, fee is divided
- uint256 diffBatches = totalBatchesBelowTarget -
- totalBatchesAboveTarget;
-
- diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
- ? _MAX_BATCH_MULTIPLIER
- : diffBatches;
-
- // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
- uint256 accDivisor = (uint256(1 ether) *
- (uint256(multiplierBatchFee) ** diffBatches)) /
- (uint256(1000) ** diffBatches);
-
- // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3)
- // accDivisor = 1E18 * multiplyFactor
- // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor
- // < 60 bits * < 70 bits / ~60 bits --> overflow not possible
- _batchFee = (uint256(1 ether) * _batchFee) / accDivisor;
- }
- }
-
- // Batch fee must remain inside a range
- if (_batchFee > _MAX_BATCH_FEE) {
- _batchFee = _MAX_BATCH_FEE;
- } else if (_batchFee < _MIN_BATCH_FEE) {
- _batchFee = _MIN_BATCH_FEE;
- }
- }
-
////////////////////////
// Emergency state functions
////////////////////////
@@ -1529,73 +1160,6 @@ contract PolygonRollupManager is
// Setter functions
//////////////////
- /**
- * @notice Set a new pending state timeout
- * The timeout can only be lowered, except if emergency state is active
- * @param newTrustedAggregatorTimeout Trusted aggregator timeout
- */
- function setTrustedAggregatorTimeout(
- uint64 newTrustedAggregatorTimeout
- ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
- if (!isEmergencyState) {
- if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) {
- revert NewTrustedAggregatorTimeoutMustBeLower();
- }
- }
-
- trustedAggregatorTimeout = newTrustedAggregatorTimeout;
- emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout);
- }
-
- /**
- * @notice Set a new trusted aggregator timeout
- * The timeout can only be lowered, except if emergency state is active
- * @param newPendingStateTimeout Trusted aggregator timeout
- */
- function setPendingStateTimeout(
- uint64 newPendingStateTimeout
- ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
- if (!isEmergencyState) {
- if (newPendingStateTimeout >= pendingStateTimeout) {
- revert NewPendingStateTimeoutMustBeLower();
- }
- }
-
- pendingStateTimeout = newPendingStateTimeout;
- emit SetPendingStateTimeout(newPendingStateTimeout);
- }
-
- /**
- * @notice Set a new multiplier batch fee
- * @param newMultiplierBatchFee multiplier batch fee
- */
- function setMultiplierBatchFee(
- uint16 newMultiplierBatchFee
- ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
- if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) {
- revert InvalidRangeMultiplierBatchFee();
- }
-
- multiplierBatchFee = newMultiplierBatchFee;
- emit SetMultiplierBatchFee(newMultiplierBatchFee);
- }
-
- /**
- * @notice Set a new verify batch time target
- * This value will only be relevant once the aggregation is decentralized, so
- * the trustedAggregatorTimeout should be zero or very close to zero
- * @param newVerifyBatchTimeTarget Verify batch time target
- */
- function setVerifyBatchTimeTarget(
- uint64 newVerifyBatchTimeTarget
- ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
- if (newVerifyBatchTimeTarget > 1 days) {
- revert InvalidRangeBatchTimeTarget();
- }
- verifyBatchTimeTarget = newVerifyBatchTimeTarget;
- emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget);
- }
-
/**
* @notice Set the current batch fee
* @param newBatchFee new batch fee
@@ -1634,7 +1198,7 @@ contract PolygonRollupManager is
// In the first iteration the nodes will be the leafs which are the local exit roots of each network
for (uint256 i = 0; i < currentNodes; i++) {
// The first rollup ID starts on 1
- tmpTree[i] = rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot;
+ tmpTree[i] = _rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot;
}
// This variable will keep track of the zero hashes
@@ -1689,7 +1253,7 @@ contract PolygonRollupManager is
function getLastVerifiedBatch(
uint32 rollupID
) public view returns (uint64) {
- return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]);
+ return _getLastVerifiedBatch(_rollupIDToRollupData[rollupID]);
}
/**
@@ -1698,46 +1262,7 @@ contract PolygonRollupManager is
function _getLastVerifiedBatch(
RollupData storage rollup
) internal view returns (uint64) {
- if (rollup.lastPendingState > 0) {
- return
- rollup
- .pendingStateTransitions[rollup.lastPendingState]
- .lastVerifiedBatch;
- } else {
- return rollup.lastVerifiedBatch;
- }
- }
-
- /**
- * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
- * @param rollupID Rollup id
- * @param pendingStateNum Pending state number to check
- * Note that his function does not check if the pending state currently exists, or if it's consolidated already
- */
- function isPendingStateConsolidable(
- uint32 rollupID,
- uint64 pendingStateNum
- ) public view returns (bool) {
- return
- _isPendingStateConsolidable(
- rollupIDToRollupData[rollupID],
- pendingStateNum
- );
- }
-
- /**
- * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
- * @param rollup Rollup data storage pointer
- * @param pendingStateNum Pending state number to check
- * Note that his function does not check if the pending state currently exists, or if it's consolidated already
- */
- function _isPendingStateConsolidable(
- RollupData storage rollup,
- uint64 pendingStateNum
- ) internal view returns (bool) {
- return (rollup.pendingStateTransitions[pendingStateNum].timestamp +
- pendingStateTimeout <=
- block.timestamp);
+ return rollup.lastVerifiedBatch;
}
/**
@@ -1770,6 +1295,61 @@ contract PolygonRollupManager is
return _batchFee * 100;
}
+ /**
+ * @notice Function to calculate the pessimistic input bytes
+ * @param rollupID Rollup id used to calculate the input snark bytes
+ * @param l1InfoTreeRoot L1 Info tree root to proof imported bridges
+ * @param newLocalExitRoot New local exit root
+ * @param newPessimisticRoot New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+ */
+ function getInputPessimisticBytes(
+ uint32 rollupID,
+ bytes32 l1InfoTreeRoot,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot
+ ) external view returns (bytes memory) {
+ return
+ _getInputPessimisticBytes(
+ rollupID,
+ _rollupIDToRollupData[rollupID],
+ l1InfoTreeRoot,
+ newLocalExitRoot,
+ newPessimisticRoot
+ );
+ }
+
+ /**
+ * @notice Function to calculate the input snark bytes
+ * @param rollupID Rollup identifier
+ * @param rollup Rollup data storage pointer
+ * @param l1InfoTreeRoot L1 Info tree root to proof imported bridges
+ * @param newLocalExitRoot New local exit root
+ * @param newPessimisticRoot New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+ */
+ function _getInputPessimisticBytes(
+ uint32 rollupID,
+ RollupData storage rollup,
+ bytes32 l1InfoTreeRoot,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot
+ ) internal view returns (bytes memory) {
+ // Get consensus information from the consensus contract
+ bytes32 consensusHash = IPolygonPessimisticConsensus(
+ address(rollup.rollupContract)
+ ).getConsensusHash();
+
+ return
+ abi.encodePacked(
+ rollup.lastLocalExitRoot,
+ rollup.lastPessimisticRoot,
+ l1InfoTreeRoot,
+ rollupID,
+ consensusHash,
+ newLocalExitRoot,
+ newPessimisticRoot
+ );
+ }
+
/**
* @notice Function to calculate the input snark bytes
* @param rollupID Rollup id used to calculate the input snark bytes
@@ -1789,7 +1369,7 @@ contract PolygonRollupManager is
) public view returns (bytes memory) {
return
_getInputSnarkBytes(
- rollupIDToRollupData[rollupID],
+ _rollupIDToRollupData[rollupID],
initNumBatch,
finalNewBatch,
newLocalExitRoot,
@@ -1882,7 +1462,7 @@ contract PolygonRollupManager is
uint32 rollupID,
uint64 batchNum
) public view returns (bytes32) {
- return rollupIDToRollupData[rollupID].batchNumToStateRoot[batchNum];
+ return _rollupIDToRollupData[rollupID].batchNumToStateRoot[batchNum];
}
/**
@@ -1894,18 +1474,55 @@ contract PolygonRollupManager is
uint32 rollupID,
uint64 batchNum
) public view returns (SequencedBatchData memory) {
- return rollupIDToRollupData[rollupID].sequencedBatches[batchNum];
+ return _rollupIDToRollupData[rollupID].sequencedBatches[batchNum];
}
/**
- * @notice Get rollup sequence pending state struct given a batch number
+ * @notice Get rollup data: VerifierType StateTransition
* @param rollupID Rollup identifier
- * @param batchNum Batch number
*/
- function getRollupPendingStateTransitions(
- uint32 rollupID,
- uint64 batchNum
- ) public view returns (PendingState memory) {
- return rollupIDToRollupData[rollupID].pendingStateTransitions[batchNum];
+ function rollupIDToRollupData(
+ uint32 rollupID
+ ) public view returns (RollupDataReturn memory rollupData) {
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
+
+ rollupData.rollupContract = rollup.rollupContract;
+ rollupData.chainID = rollup.chainID;
+ rollupData.verifier = rollup.verifier;
+ rollupData.forkID = rollup.forkID;
+ rollupData.lastLocalExitRoot = rollup.lastLocalExitRoot;
+ rollupData.lastBatchSequenced = rollup.lastBatchSequenced;
+ rollupData.lastVerifiedBatch = rollup.lastVerifiedBatch;
+ rollupData._legacyLastPendingState = rollup._legacyLastPendingState;
+ rollupData._legacyLastPendingStateConsolidated = rollup
+ ._legacyLastPendingStateConsolidated;
+ rollupData.lastVerifiedBatchBeforeUpgrade = rollup
+ .lastVerifiedBatchBeforeUpgrade;
+ rollupData.rollupTypeID = rollup.rollupTypeID;
+ rollupData.rollupVerifierType = rollup.rollupVerifierType;
+ }
+
+ /**
+ * @notice Get rollup data: VerifierType Pessimistic
+ * @param rollupID Rollup identifier
+ */
+ function rollupIDToRollupDataV2(
+ uint32 rollupID
+ ) public view returns (RollupDataReturnV2 memory rollupData) {
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
+
+ rollupData.rollupContract = address(rollup.rollupContract);
+ rollupData.chainID = rollup.chainID;
+ rollupData.verifier = rollup.verifier;
+ rollupData.forkID = rollup.forkID;
+ rollupData.lastLocalExitRoot = rollup.lastLocalExitRoot;
+ rollupData.lastBatchSequenced = rollup.lastBatchSequenced;
+ rollupData.lastVerifiedBatch = rollup.lastVerifiedBatch;
+ rollupData.lastVerifiedBatchBeforeUpgrade = rollup
+ .lastVerifiedBatchBeforeUpgrade;
+ rollupData.rollupTypeID = rollup.rollupTypeID;
+ rollupData.rollupVerifierType = rollup.rollupVerifierType;
+ rollupData.lastPessimisticRoot = rollup.lastPessimisticRoot;
+ rollupData.programVKey = rollup.programVKey;
}
}
diff --git a/contracts/v2/PolygonZkEVMBridgeV2.sol b/contracts/v2/PolygonZkEVMBridgeV2.sol
index 8f88fa8e5..3045b642d 100644
--- a/contracts/v2/PolygonZkEVMBridgeV2.sol
+++ b/contracts/v2/PolygonZkEVMBridgeV2.sol
@@ -30,10 +30,10 @@ contract PolygonZkEVMBridgeV2 is
}
// bytes4(keccak256(bytes("permit(address,address,uint256,uint256,uint8,bytes32,bytes32)")));
- bytes4 private constant _PERMIT_SIGNATURE = 0xd505accf;
+ bytes4 internal constant _PERMIT_SIGNATURE = 0xd505accf;
// bytes4(keccak256(bytes("permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)")));
- bytes4 private constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c;
+ bytes4 internal constant _PERMIT_SIGNATURE_DAI = 0x8fcbaf0c;
// Mainnet identifier
uint32 private constant _MAINNET_NETWORK_ID = 0;
@@ -48,7 +48,7 @@ contract PolygonZkEVMBridgeV2 is
uint8 private constant _LEAF_TYPE_MESSAGE = 1;
// Nullifier offset
- uint256 private constant _MAX_LEAFS_PER_NETWORK = 2 ** 32;
+ uint256 internal constant _MAX_LEAFS_PER_NETWORK = 2 ** 32;
// Indicate where's the mainnet flag bit in the global index
uint256 private constant _GLOBAL_INDEX_MAINNET_FLAG = 2 ** 64;
@@ -89,8 +89,16 @@ contract PolygonZkEVMBridgeV2 is
bytes public gasTokenMetadata;
// WETH address
+ // @note WETH address will only be present when the native token is not ether, but another gasToken.
+ // This variable is set at the initialization of the contract in case there's a gas token differnet than ether, (gasTokenAddress != address(0) ) so a new wrapped Token will be deployed to handle ether that came from other networks
TokenWrapped public WETHToken;
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ */
+ uint256[50] private _gap;
+
/**
* @dev Emitted when bridge assets or messages to another network
*/
@@ -197,7 +205,7 @@ contract PolygonZkEVMBridgeV2 is
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
- * @param token Token address, 0 address is reserved for ether
+ * @param token Token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param forceUpdateGlobalExitRoot Indicates if the new global exit root is updated or not
* @param permitData Raw data of the call `permit` of the token
*/
@@ -238,7 +246,7 @@ contract PolygonZkEVMBridgeV2 is
// In case ether is the native token, WETHToken will be 0, and the address 0 is already checked
if (token == address(WETHToken)) {
// Burn tokens
- TokenWrapped(token).burn(msg.sender, amount);
+ _bridgeWrappedAsset(TokenWrapped(token), amount);
// Both origin network and originTokenAddress will be 0
// Metadata will be empty
@@ -250,8 +258,7 @@ contract PolygonZkEVMBridgeV2 is
if (tokenInfo.originTokenAddress != address(0)) {
// The token is a wrapped token from another network
- // Burn tokens
- TokenWrapped(token).burn(msg.sender, amount);
+ _bridgeWrappedAsset(TokenWrapped(token), amount);
originTokenAddress = tokenInfo.originTokenAddress;
originNetwork = tokenInfo.originNetwork;
@@ -364,7 +371,7 @@ contract PolygonZkEVMBridgeV2 is
}
// Burn wETH tokens
- WETHToken.burn(msg.sender, amountWETH);
+ _bridgeWrappedAsset(WETHToken, amountWETH);
_bridgeMessage(
destinationNetwork,
@@ -437,7 +444,7 @@ contract PolygonZkEVMBridgeV2 is
* @param mainnetExitRoot Mainnet exit root
* @param rollupExitRoot Rollup exit root
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
@@ -492,7 +499,7 @@ contract PolygonZkEVMBridgeV2 is
}
} else {
// Claim wETH
- WETHToken.mint(destinationAddress, amount);
+ _claimWrappedAsset(WETHToken, destinationAddress, amount);
}
} else {
// Check if it's gas token
@@ -536,7 +543,11 @@ contract PolygonZkEVMBridgeV2 is
);
// Mint tokens for the destination address
- newWrappedToken.mint(destinationAddress, amount);
+ _claimWrappedAsset(
+ newWrappedToken,
+ destinationAddress,
+ amount
+ );
// Create mappings
tokenInfoToWrappedToken[tokenInfoHash] = address(
@@ -555,7 +566,8 @@ contract PolygonZkEVMBridgeV2 is
);
} else {
// Use the existing wrapped erc20
- TokenWrapped(wrappedToken).mint(
+ _claimWrappedAsset(
+ TokenWrapped(wrappedToken),
destinationAddress,
amount
);
@@ -646,7 +658,7 @@ contract PolygonZkEVMBridgeV2 is
);
} else {
// Mint wETH tokens
- WETHToken.mint(destinationAddress, amount);
+ _claimWrappedAsset(WETHToken, destinationAddress, amount);
// Execute message
/* solhint-disable avoid-low-level-calls */
@@ -677,7 +689,7 @@ contract PolygonZkEVMBridgeV2 is
* Since the metadata has relevance in the address deployed, this function will not return a valid
* wrapped address if the metadata provided is not the original one.
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param name Name of the token
* @param symbol Symbol of the token
* @param decimals Decimals of the token
@@ -714,7 +726,7 @@ contract PolygonZkEVMBridgeV2 is
/**
* @notice Returns the address of a wrapper using the token information if already exist
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
*/
function getTokenWrappedAddress(
uint32 originNetwork,
@@ -730,7 +742,7 @@ contract PolygonZkEVMBridgeV2 is
* @notice Function to activate the emergency state
" Only can be called by the Polygon ZK-EVM in extreme situations
*/
- function activateEmergencyState() external onlyRollupManager {
+ function activateEmergencyState() external virtual onlyRollupManager {
_activateEmergencyState();
}
@@ -738,7 +750,7 @@ contract PolygonZkEVMBridgeV2 is
* @notice Function to deactivate the emergency state
" Only can be called by the Polygon ZK-EVM
*/
- function deactivateEmergencyState() external onlyRollupManager {
+ function deactivateEmergencyState() external virtual onlyRollupManager {
_deactivateEmergencyState();
}
@@ -827,7 +839,7 @@ contract PolygonZkEVMBridgeV2 is
function isClaimed(
uint32 leafIndex,
uint32 sourceBridgeNetwork
- ) external view returns (bool) {
+ ) external view virtual returns (bool) {
uint256 globalIndex;
// For consistency with the previous setted nullifiers
@@ -855,7 +867,7 @@ contract PolygonZkEVMBridgeV2 is
function _setAndCheckClaimed(
uint32 leafIndex,
uint32 sourceBridgeNetwork
- ) private {
+ ) internal virtual {
uint256 globalIndex;
// For consistency with the previous setted nullifiers
@@ -895,13 +907,43 @@ contract PolygonZkEVMBridgeV2 is
globalExitRootManager.updateExitRoot(getRoot());
}
+ /**
+ * @notice Burn tokens from wrapped token to execute the bridge
+ * note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+ * @param tokenWrapped Wrapped token to burnt
+ * @param amount Amount of tokens
+ */
+ function _bridgeWrappedAsset(
+ TokenWrapped tokenWrapped,
+ uint256 amount
+ ) internal virtual {
+ // Burn tokens
+ tokenWrapped.burn(msg.sender, amount);
+ }
+
+ /**
+ * @notice Mints tokens from wrapped token to proceed with the claim
+ * note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+ * @param tokenWrapped Wrapped token to mint
+ * @param destinationAddress Minted token receiver
+ * @param amount Amount of tokens
+ */
+ function _claimWrappedAsset(
+ TokenWrapped tokenWrapped,
+ address destinationAddress,
+ uint256 amount
+ ) internal virtual {
+ // Mint tokens
+ tokenWrapped.mint(destinationAddress, amount);
+ }
+
/**
* @notice Function decode an index into a wordPos and bitPos
* @param index Index
*/
function _bitmapPositions(
uint256 index
- ) private pure returns (uint256 wordPos, uint256 bitPos) {
+ ) internal pure returns (uint256 wordPos, uint256 bitPos) {
wordPos = uint248(index >> 8);
bitPos = uint8(index);
}
@@ -916,7 +958,7 @@ contract PolygonZkEVMBridgeV2 is
address token,
uint256 amount,
bytes calldata permitData
- ) internal {
+ ) internal virtual {
bytes4 sig = bytes4(permitData[:4]);
if (sig == _PERMIT_SIGNATURE) {
(
@@ -1140,7 +1182,7 @@ contract PolygonZkEVMBridgeV2 is
* Since the metadata has relevance in the address deployed, this function will not return a valid
* wrapped address if the metadata provided is not the original one.
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param token Address of the token to calculate the wrapper address
*/
function calculateTokenWrapperAddress(
diff --git a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol
index 824ac3e8f..5298249a7 100644
--- a/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol
+++ b/contracts/v2/PolygonZkEVMGlobalExitRootV2.sol
@@ -6,13 +6,15 @@ import "./interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
import "./lib/PolygonZkEVMGlobalExitRootBaseStorage.sol";
import "../lib/GlobalExitRootLib.sol";
import "./lib/DepositContractBase.sol";
+import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
/**
* Contract responsible for managing the exit roots across multiple networks
*/
contract PolygonZkEVMGlobalExitRootV2 is
PolygonZkEVMGlobalExitRootBaseStorage,
- DepositContractBase
+ DepositContractBase,
+ Initializable
{
// PolygonZkEVMBridge address
address public immutable bridgeAddress;
@@ -20,6 +22,9 @@ contract PolygonZkEVMGlobalExitRootV2 is
// Rollup manager contract address
address public immutable rollupManager;
+ // Store every l1InfoLeaf
+ mapping(uint32 leafCount => bytes32 l1InfoRoot) public l1InfoRootMap;
+
/**
* @dev Emitted when the global exit root is updated
*/
@@ -28,6 +33,21 @@ contract PolygonZkEVMGlobalExitRootV2 is
bytes32 indexed rollupExitRoot
);
+ /**
+ * @dev Emitted when the global exit root is updated with the L1InfoTree leaf information
+ */
+ event UpdateL1InfoTreeV2(
+ bytes32 currentL1InfoRoot,
+ uint32 indexed leafCount,
+ uint256 blockhash,
+ uint64 minTimestamp
+ );
+
+ /**
+ * @dev Emitted when the global exit root manager starts adding leafs to the L1InfoRootMap
+ */
+ event InitL1InfoRootMap(uint32 leafCount, bytes32 currentL1InfoRoot);
+
/**
* @param _rollupManager Rollup manager contract address
* @param _bridgeAddress PolygonZkEVMBridge contract address
@@ -35,6 +55,22 @@ contract PolygonZkEVMGlobalExitRootV2 is
constructor(address _rollupManager, address _bridgeAddress) {
rollupManager = _rollupManager;
bridgeAddress = _bridgeAddress;
+
+ // disable initializers
+ _disableInitializers();
+ }
+
+ /**
+ * @notice Reset the deposit tree since will be replace by a recursive one
+ */
+ function initialize() external virtual initializer {
+ // Get the current historic root
+ bytes32 currentL1InfoRoot = getRoot();
+
+ // Store L1InfoRoot
+ l1InfoRootMap[uint32(depositCount)] = currentL1InfoRoot;
+
+ emit InitL1InfoRootMap(uint32(depositCount), currentL1InfoRoot);
}
/**
@@ -42,7 +78,7 @@ contract PolygonZkEVMGlobalExitRootV2 is
* @param newRoot new exit tree root
*/
function updateExitRoot(bytes32 newRoot) external {
- // Store storage variables into temporal variables since will be used multiple times
+ // Store storage variables into temporary variables since will be used multiple times
bytes32 cacheLastRollupExitRoot;
bytes32 cacheLastMainnetExitRoot;
@@ -65,22 +101,33 @@ contract PolygonZkEVMGlobalExitRootV2 is
// If it already exists, do not modify the blockhash
if (globalExitRootMap[newGlobalExitRoot] == 0) {
+ uint64 currentTimestamp = uint64(block.timestamp);
+
uint256 lastBlockHash = uint256(blockhash(block.number - 1));
globalExitRootMap[newGlobalExitRoot] = lastBlockHash;
// save new leaf in L1InfoTree
_addLeaf(
- getLeafValue(
- newGlobalExitRoot,
- lastBlockHash,
- uint64(block.timestamp)
- )
+ getLeafValue(newGlobalExitRoot, lastBlockHash, currentTimestamp)
);
+ // Get the current historic root
+ bytes32 currentL1InfoRoot = getRoot();
+
+ // Store L1InfoRoot
+ l1InfoRootMap[uint32(depositCount)] = currentL1InfoRoot;
+
emit UpdateL1InfoTree(
cacheLastMainnetExitRoot,
cacheLastRollupExitRoot
);
+
+ emit UpdateL1InfoTreeV2(
+ currentL1InfoRoot,
+ uint32(depositCount),
+ lastBlockHash,
+ currentTimestamp
+ );
}
}
@@ -110,7 +157,7 @@ contract PolygonZkEVMGlobalExitRootV2 is
/**
* @notice Given the leaf data returns the leaf hash
* @param newGlobalExitRoot Last global exit root
- * @param lastBlockHash Last accesible block hash
+ * @param lastBlockHash Last accessible block hash
* @param timestamp Ethereum timestamp in seconds
*/
function getLeafValue(
diff --git a/contracts/v2/consensus/pessimistic/PolygonPessimisticConsensus.sol b/contracts/v2/consensus/pessimistic/PolygonPessimisticConsensus.sol
new file mode 100644
index 000000000..cc2d59525
--- /dev/null
+++ b/contracts/v2/consensus/pessimistic/PolygonPessimisticConsensus.sol
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity 0.8.20;
+
+import "../../lib/PolygonConsensusBase.sol";
+import "../../interfaces/IPolygonPessimisticConsensus.sol";
+
+contract PolygonPessimisticConsensus is
+ PolygonConsensusBase,
+ IPolygonPessimisticConsensus
+{
+ uint32 public constant CONSENSUS_TYPE = 0;
+
+ /**
+ * @param _globalExitRootManager Global exit root manager address
+ * @param _pol POL token address
+ * @param _bridgeAddress Bridge address
+ * @param _rollupManager Rollup manager address
+ */
+ constructor(
+ IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ IERC20Upgradeable _pol,
+ IPolygonZkEVMBridgeV2 _bridgeAddress,
+ PolygonRollupManager _rollupManager
+ )
+ PolygonConsensusBase(
+ _globalExitRootManager,
+ _pol,
+ _bridgeAddress,
+ _rollupManager
+ )
+ {}
+
+ /**
+ * Note Return the necessary consensus information for the proof hashed
+ */
+ function getConsensusHash() public view returns (bytes32) {
+ return keccak256(abi.encodePacked(CONSENSUS_TYPE, trustedSequencer));
+ }
+}
diff --git a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol
index 8e49cfda3..77b0784e8 100644
--- a/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol
+++ b/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol
@@ -77,9 +77,10 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
/**
* @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param l1InfoTreeLeafCount Count of the L1InfoTree leaf that will be used in this sequence
* @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
* This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * @param expectedFinalAccInputHash This parameter must match the acc input hash after hash all the batch data
* This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
* @param dataAvailabilityMessage Byte array containing the signatures and all the addresses of the committee in ascending order
@@ -89,8 +90,9 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
*/
function sequenceBatchesValidium(
ValidiumBatchData[] calldata batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase,
bytes calldata dataAvailabilityMessage
) external onlyTrustedSequencer {
@@ -114,7 +116,13 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
bridgeAddress.updateGlobalExitRoot();
// Get global batch variables
- bytes32 l1InfoRoot = globalExitRootManager.getRoot();
+ bytes32 l1InfoRoot = globalExitRootManager.l1InfoRootMap(
+ l1InfoTreeLeafCount
+ );
+
+ if (l1InfoRoot == bytes32(0)) {
+ revert L1InfoTreeLeafCountInvalid();
+ }
// Store storage variables in memory, to save gas, because will be overrided multiple times
uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
@@ -123,9 +131,6 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
// Store in a temporal variable, for avoid access again the storage slot
uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced;
- // Accumulated sequenced transaction hash to verify them afterward against the dataAvailabilityProtocol
- bytes32 accumulatedNonForcedTransactionsHash = bytes32(0);
-
for (uint256 i = 0; i < batchesNum; i++) {
// Load current sequence
ValidiumBatchData memory currentBatch = batches[i];
@@ -166,14 +171,6 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
// Delete forceBatch data since won't be used anymore
delete forcedBatches[currentLastForceBatchSequenced];
} else {
- // Accumulate non forced transactions hash
- accumulatedNonForcedTransactionsHash = keccak256(
- abi.encodePacked(
- accumulatedNonForcedTransactionsHash,
- currentBatch.transactionsHash
- )
- );
-
// Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path
// The synchronizer should be aware of that
@@ -229,7 +226,7 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
// Validate that the data availability protocol accepts the dataAvailabilityMessage
// note This is a view function, so there's not much risk even if this contract was vulnerable to reentrant attacks
dataAvailabilityProtocol.verifyMessage(
- accumulatedNonForcedTransactionsHash,
+ expectedFinalAccInputHash,
dataAvailabilityMessage
);
}
@@ -239,11 +236,9 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
currentAccInputHash
);
- // Check init sequenced batch
- if (
- initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
- ) {
- revert InitSequencedBatchDoesNotMatch();
+ // Check expectedFinalAccInputHash
+ if (currentAccInputHash != expectedFinalAccInputHash) {
+ revert FinalAccInputHashDoesNotMatch();
}
emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
@@ -252,17 +247,19 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
/**
* @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param l1InfoTreeLeafCount Count of the L1InfoTree leaf that will be used in this sequence
* @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
* This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * @param expectedFinalAccInputHash This parameter must match the acc input hash after hash all the batch data
* This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
* note Pol is not a reentrant token
*/
function sequenceBatches(
BatchData[] calldata batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase
) public override {
if (!isSequenceWithDataAvailabilityAllowed) {
@@ -270,8 +267,9 @@ contract PolygonValidiumEtrog is PolygonRollupBaseEtrog, IPolygonValidium {
}
super.sequenceBatches(
batches,
+ l1InfoTreeLeafCount,
maxSequenceTimestamp,
- initSequencedBatch,
+ expectedFinalAccInputHash,
l2Coinbase
);
}
diff --git a/contracts/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.sol b/contracts/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.sol
deleted file mode 100644
index 1ce610efa..000000000
--- a/contracts/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.sol
+++ /dev/null
@@ -1,945 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0
-pragma solidity ^0.8.20;
-
-import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
-import "../../../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
-import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
-import "../../../../interfaces/IPolygonZkEVMErrors.sol";
-import "../../../interfaces/IPolygonZkEVMVEtrogErrors.sol";
-import "../../../PolygonRollupManager.sol";
-import "../../../interfaces/IPolygonRollupBase.sol";
-import "../../../interfaces/IPolygonZkEVMBridgeV2.sol";
-import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
-import "../../../lib/PolygonConstantsBase.sol";
-
-/**
- * Contract responsible for managing the states and the updates of L2 network.
- * There will be a trusted sequencer, which is able to send transactions.
- * Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
- * The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
- * The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
- * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
- */
-abstract contract PolygonRollupBaseEtrogNoGap is
- Initializable,
- PolygonConstantsBase,
- IPolygonZkEVMVEtrogErrors,
- IPolygonRollupBase
-{
- using SafeERC20Upgradeable for IERC20Upgradeable;
-
- /**
- * @notice Struct which will be used to call sequenceBatches
- * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature:
- * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s
- * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s
- * @param forcedGlobalExitRoot Global exit root, empty when sequencing a non forced batch
- * @param forcedTimestamp Minimum timestamp of the force batch data, empty when sequencing a non forced batch
- * @param forcedBlockHashL1 blockHash snapshot of the force batch data, empty when sequencing a non forced batch
- */
- struct BatchData {
- bytes transactions;
- bytes32 forcedGlobalExitRoot;
- uint64 forcedTimestamp;
- bytes32 forcedBlockHashL1;
- }
-
- // Max transactions bytes that can be added in a single batch
- // Max keccaks circuit = (2**23 / 155286) * 44 = 2376
- // Bytes per keccak = 136
- // Minimum Static keccaks batch = 2
- // Max bytes allowed = (2376 - 2) * 136 = 322864 bytes - 1 byte padding
- // Rounded to 300000 bytes
- // In order to process the transaction, the data is approximately hashed twice for ecrecover:
- // 300000 bytes / 2 = 150000 bytes
- // Since geth pool currently only accepts at maximum 128kb transactions:
- // https://github.com/ethereum/go-ethereum/blob/master/core/txpool/txpool.go#L54
- // We will limit this length to be compliant with the geth restrictions since our node will use it
- // We let 8kb as a sanity margin
- uint256 internal constant _MAX_TRANSACTIONS_BYTE_LENGTH = 120000;
-
- // Max force batch transaction length
- // This is used to avoid huge calldata attacks, where the attacker call force batches from another contract
- uint256 internal constant _MAX_FORCE_BATCH_BYTE_LENGTH = 5000;
-
- // In order to encode the initialize transaction of the bridge there's have a constant part and the metadata which is variable
- // Note the total transaction will be constrained to 65535 to avoid attacks and simplify the implementation
-
- // List rlp: 1 listLenLen "0xf9" (0xf7 + 2), + listLen 2 (32 bytes + txData bytes) (do not accept more than 65535 bytes)
-
- // First byte of the initialize bridge tx, indicates a list with a lengt of 2 bytes
- // Since the minimum constant bytes will be: 259 (tx data empty) + 31 (tx parameters) = 259 (0x103) will always take 2 bytes to express the lenght of the rlp
- // Note that more than 2 bytes of list len is not supported, since it's constrained to 65535
- uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9;
-
- // Tx parameters until the bridge address
- bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094";
-
- // RLP encoded metadata (non empty)
-
- // TxData bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes +
- // (abi encoded metadata: 32 bytes position + 32 bytes len + 32 bytes position name + 32 bytes length name + 32 bytes position Symbol + 32 bytes length Symbol
- //+ 32 bytes decimal )) min 7*32 bytes =
- // = 164 bytes + 224 bytes = 388 (0x0184) minimum
- // Extra data: nameLen padded to 32 bytes + symbol len padded to 32 bytes
-
- // Constant bytes: 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas)
- // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb9" (0xb7 + 2) +
- // stringLen (0x0184 + nameLen padded to 32 bytes + symbol len padded to 32 bytes) + txData bytes = 32 bytes + txData bytes
- uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32;
-
- // Tx parameters after the bridge address
- bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS =
- hex"80b9";
-
- // RLP empty metadata
-
- // TxData empty metadata bytes: 164 bytes data ( signature 4 bytes + 5 parameters*32bytes +
- // (abi encoded metadata: 32 bytes position + 32 bytes len = 2*32 bytes =
- // = 164 bytes + 64 bytes = 228 (0xe4)
-
- // Constant bytes empty metadata : 1 nonce "0x80" + 1 gasPrice "0x80" + 5 gasLimit "0x8401c9c380" (30M gas)
- // + 21 to ("0x94" + bridgeAddress") + 1 value "0x80" + 1 stringLenLen "0xb8" (0xb7 + 1) +
- // 1 stringLen (0xe4) + txData bytes = 31 bytes + txData bytes empty metadata 228 = 259
- uint16 public constant INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA = 31;
-
- uint8 public constant INITIALIZE_TX_DATA_LEN_EMPTY_METADATA = 228; // 0xe4
-
- // Tx parameters after the bridge address
- bytes
- public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA =
- hex"80b8";
-
- // Signature used to initialize the bridge
-
- // V parameter of the initialize signature
- uint8 public constant SIGNATURE_INITIALIZE_TX_V = 27;
-
- // R parameter of the initialize signature
- bytes32 public constant SIGNATURE_INITIALIZE_TX_R =
- 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0;
-
- // S parameter of the initialize signature
- bytes32 public constant SIGNATURE_INITIALIZE_TX_S =
- 0x000000000000000000000000000000000000000000000000000000005ca1ab1e;
-
- // Effective percentage of the initalize transaction
- bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF;
-
- // Global Exit Root address L2
- IBasePolygonZkEVMGlobalExitRoot
- public constant GLOBAL_EXIT_ROOT_MANAGER_L2 =
- IBasePolygonZkEVMGlobalExitRoot(
- 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA
- );
-
- // Timestamp range that's given to the sequencer as a safety measure to avoid reverts if the transaction is mined to quickly
- uint256 public constant TIMESTAMP_RANGE = 36;
-
- // POL token address
- IERC20Upgradeable public immutable pol;
-
- // Global Exit Root interface
- IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
-
- // PolygonZkEVM Bridge Address
- IPolygonZkEVMBridgeV2 public immutable bridgeAddress;
-
- // Rollup manager
- PolygonRollupManager public immutable rollupManager;
-
- // Address that will be able to adjust contract parameters
- address public admin;
-
- // This account will be able to accept the admin role
- address public pendingAdmin;
-
- // Trusted sequencer address
- address public trustedSequencer;
-
- // Trusted sequencer URL
- string public trustedSequencerURL;
-
- // L2 network name
- string public networkName;
-
- // Current accumulate input hash
- bytes32 public lastAccInputHash;
-
- // Queue of forced batches with their associated data
- // ForceBatchNum --> hashedForcedBatchData
- // hashedForcedBatchData: hash containing the necessary information to force a batch:
- // keccak256(keccak256(bytes transactions), bytes32 forcedGlobalExitRoot, unint64 forcedTimestamp, bytes32 forcedBlockHashL1)
- mapping(uint64 => bytes32) public forcedBatches;
-
- // Last forced batch
- uint64 public lastForceBatch;
-
- // Last forced batch included in the sequence
- uint64 public lastForceBatchSequenced;
-
- // Force batch timeout
- uint64 public forceBatchTimeout;
-
- // Indicates what address is able to do forced batches
- // If the address is set to 0, forced batches are open to everyone
- address public forceBatchAddress;
-
- // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes
- address public gasTokenAddress;
-
- // Native network of the token address of the gas tokena address. This variable it's just for read purposes
- uint32 public gasTokenNetwork;
-
- /**
- * @dev Emitted when the trusted sequencer sends a new batch of transactions
- */
- event SequenceBatches(uint64 indexed numBatch, bytes32 l1InfoRoot);
-
- /**
- * @dev Emitted when a batch is forced
- */
- event ForceBatch(
- uint64 indexed forceBatchNum,
- bytes32 lastGlobalExitRoot,
- address sequencer,
- bytes transactions
- );
-
- /**
- * @dev Emitted when forced batches are sequenced by not the trusted sequencer
- */
- event SequenceForceBatches(uint64 indexed numBatch);
-
- /**
- * @dev Emitted when the contract is initialized, contain the first sequenced transaction
- */
- event InitialSequenceBatches(
- bytes transactions,
- bytes32 lastGlobalExitRoot,
- address sequencer
- );
-
- /**
- * @dev Emitted when a aggregator verifies batches
- */
- event VerifyBatches(
- uint64 indexed numBatch,
- bytes32 stateRoot,
- address indexed aggregator
- );
-
- /**
- * @dev Emitted when the admin updates the trusted sequencer address
- */
- event SetTrustedSequencer(address newTrustedSequencer);
-
- /**
- * @dev Emitted when the admin updates the sequencer URL
- */
- event SetTrustedSequencerURL(string newTrustedSequencerURL);
-
- /**
- * @dev Emitted when the admin update the force batch timeout
- */
- event SetForceBatchTimeout(uint64 newforceBatchTimeout);
-
- /**
- * @dev Emitted when the admin update the force batch address
- */
- event SetForceBatchAddress(address newForceBatchAddress);
-
- /**
- * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin
- */
- event TransferAdminRole(address newPendingAdmin);
-
- /**
- * @dev Emitted when the pending admin accepts the admin role
- */
- event AcceptAdminRole(address newAdmin);
-
- // General parameters that will have in common all networks that deploys rollup manager
-
- /**
- * @param _globalExitRootManager Global exit root manager address
- * @param _pol POL token address
- * @param _bridgeAddress Bridge address
- * @param _rollupManager Global exit root manager address
- */
- constructor(
- IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
- IERC20Upgradeable _pol,
- IPolygonZkEVMBridgeV2 _bridgeAddress,
- PolygonRollupManager _rollupManager
- ) {
- globalExitRootManager = _globalExitRootManager;
- pol = _pol;
- bridgeAddress = _bridgeAddress;
- rollupManager = _rollupManager;
- }
-
- /**
- * @param _admin Admin address
- * @param sequencer Trusted sequencer address
- * @param networkID Indicates the network identifier that will be used in the bridge
- * @param _gasTokenAddress Indicates the token address in mainnet that will be used as a gas token
- * Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead
- * @param sequencerURL Trusted sequencer URL
- * @param _networkName L2 network name
- */
- function initialize(
- address _admin,
- address sequencer,
- uint32 networkID,
- address _gasTokenAddress,
- string memory sequencerURL,
- string memory _networkName
- ) external virtual onlyRollupManager initializer {
- bytes memory gasTokenMetadata;
-
- if (_gasTokenAddress != address(0)) {
- // Ask for token metadata, the same way is enconded in the bridge
- // Note that this function will revert if the token is not in this network
- // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call
- gasTokenMetadata = bridgeAddress.getTokenMetadata(_gasTokenAddress);
-
- // Check gas token address on the bridge
- (
- uint32 originWrappedNetwork,
- address originWrappedAddress
- ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress);
-
- if (originWrappedNetwork != 0) {
- // It's a wrapped token, get the wrapped parameters
- gasTokenAddress = originWrappedAddress;
- gasTokenNetwork = originWrappedNetwork;
- } else {
- // gasTokenNetwork will be mainnet, for instance 0
- gasTokenAddress = _gasTokenAddress;
- }
- }
- // Sequence transaction to initilize the bridge
-
- // Calculate transaction to initialize the bridge
- bytes memory transaction = generateInitializeTransaction(
- networkID,
- gasTokenAddress,
- gasTokenNetwork,
- gasTokenMetadata
- );
-
- bytes32 currentTransactionsHash = keccak256(transaction);
-
- // Get current timestamp and global exit root
- uint64 currentTimestamp = uint64(block.timestamp);
- bytes32 lastGlobalExitRoot = globalExitRootManager
- .getLastGlobalExitRoot();
-
- // Add the transaction to the sequence as if it was a force transaction
- bytes32 newAccInputHash = keccak256(
- abi.encodePacked(
- bytes32(0), // Current acc Input hash
- currentTransactionsHash,
- lastGlobalExitRoot, // Global exit root
- currentTimestamp,
- sequencer,
- blockhash(block.number - 1)
- )
- );
-
- lastAccInputHash = newAccInputHash;
-
- rollupManager.onSequenceBatches(
- uint64(1), // num total batches
- newAccInputHash
- );
-
- // Set initialize variables
- admin = _admin;
- trustedSequencer = sequencer;
-
- trustedSequencerURL = sequencerURL;
- networkName = _networkName;
-
- forceBatchAddress = _admin;
-
- // Constant deployment variables
- forceBatchTimeout = 5 days;
-
- emit InitialSequenceBatches(transaction, lastGlobalExitRoot, sequencer);
- }
-
- modifier onlyAdmin() {
- if (admin != msg.sender) {
- revert OnlyAdmin();
- }
- _;
- }
-
- modifier onlyTrustedSequencer() {
- if (trustedSequencer != msg.sender) {
- revert OnlyTrustedSequencer();
- }
- _;
- }
-
- modifier isSenderAllowedToForceBatches() {
- address cacheForceBatchAddress = forceBatchAddress;
- if (
- cacheForceBatchAddress != address(0) &&
- cacheForceBatchAddress != msg.sender
- ) {
- revert ForceBatchNotAllowed();
- }
- _;
- }
-
- modifier onlyRollupManager() {
- if (address(rollupManager) != msg.sender) {
- revert OnlyRollupManager();
- }
- _;
- }
-
- /////////////////////////////////////
- // Sequence/Verify batches functions
- ////////////////////////////////////
-
- /**
- * @notice Allows a sequencer to send multiple batches
- * @param batches Struct array which holds the necessary data to append new batches to the sequence
- * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
- * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
- * This will be a protection for the sequencer to avoid sending undesired data
- * @param l2Coinbase Address that will receive the fees from L2
- * note Pol is not a reentrant token
- */
- function sequenceBatches(
- BatchData[] calldata batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase
- ) public virtual onlyTrustedSequencer {
- uint256 batchesNum = batches.length;
- if (batchesNum == 0) {
- revert SequenceZeroBatches();
- }
-
- if (batchesNum > _MAX_VERIFY_BATCHES) {
- revert ExceedMaxVerifyBatches();
- }
-
- // Check max sequence timestamp inside of range
- if (
- uint256(maxSequenceTimestamp) > (block.timestamp + TIMESTAMP_RANGE)
- ) {
- revert MaxTimestampSequenceInvalid();
- }
-
- // Update global exit root if there are new deposits
- bridgeAddress.updateGlobalExitRoot();
-
- // Get global batch variables
- bytes32 l1InfoRoot = globalExitRootManager.getRoot();
-
- // Store storage variables in memory, to save gas, because will be overrided multiple times
- uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
- bytes32 currentAccInputHash = lastAccInputHash;
-
- // Store in a temporal variable, for avoid access again the storage slot
- uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced;
-
- for (uint256 i = 0; i < batchesNum; i++) {
- // Load current sequence
- BatchData memory currentBatch = batches[i];
-
- // Store the current transactions hash since can be used more than once for gas saving
- bytes32 currentTransactionsHash = keccak256(
- currentBatch.transactions
- );
-
- // Check if it's a forced batch
- if (currentBatch.forcedTimestamp > 0) {
- currentLastForceBatchSequenced++;
-
- // Check forced data matches
- bytes32 hashedForcedBatchData = keccak256(
- abi.encodePacked(
- currentTransactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- currentBatch.forcedBlockHashL1
- )
- );
-
- if (
- hashedForcedBatchData !=
- forcedBatches[currentLastForceBatchSequenced]
- ) {
- revert ForcedDataDoesNotMatch();
- }
-
- // Calculate next accumulated input hash
- currentAccInputHash = keccak256(
- abi.encodePacked(
- currentAccInputHash,
- currentTransactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- l2Coinbase,
- currentBatch.forcedBlockHashL1
- )
- );
-
- // Delete forceBatch data since won't be used anymore
- delete forcedBatches[currentLastForceBatchSequenced];
- } else {
- // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path
- // The synchronizer should be aware of that
- if (
- currentBatch.transactions.length >
- _MAX_TRANSACTIONS_BYTE_LENGTH
- ) {
- revert TransactionsLengthAboveMax();
- }
-
- // Calculate next accumulated input hash
- currentAccInputHash = keccak256(
- abi.encodePacked(
- currentAccInputHash,
- currentTransactionsHash,
- l1InfoRoot,
- maxSequenceTimestamp,
- l2Coinbase,
- bytes32(0)
- )
- );
- }
- }
-
- // Sanity check, should be unreachable
- if (currentLastForceBatchSequenced > lastForceBatch) {
- revert ForceBatchesOverflow();
- }
-
- // Store back the storage variables
- lastAccInputHash = currentAccInputHash;
-
- uint256 nonForcedBatchesSequenced = batchesNum;
-
- // Check if there has been forced batches
- if (currentLastForceBatchSequenced != initLastForceBatchSequenced) {
- uint64 forcedBatchesSequenced = currentLastForceBatchSequenced -
- initLastForceBatchSequenced;
- // substract forced batches
- nonForcedBatchesSequenced -= forcedBatchesSequenced;
-
- // Transfer pol for every forced batch submitted
- pol.safeTransfer(
- address(rollupManager),
- calculatePolPerForceBatch() * (forcedBatchesSequenced)
- );
-
- // Store new last force batch sequenced
- lastForceBatchSequenced = currentLastForceBatchSequenced;
- }
-
- // Pay collateral for every non-forced batch submitted
- pol.safeTransferFrom(
- msg.sender,
- address(rollupManager),
- rollupManager.getBatchFee() * nonForcedBatchesSequenced
- );
-
- uint64 currentBatchSequenced = rollupManager.onSequenceBatches(
- uint64(batchesNum),
- currentAccInputHash
- );
-
- // Check init sequenced batch
- if (
- initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
- ) {
- revert InitSequencedBatchDoesNotMatch();
- }
-
- emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
- }
-
- /**
- * @notice Callback on verify batches, can only be called by the rollup manager
- * @param lastVerifiedBatch Last verified batch
- * @param newStateRoot new state root
- * @param aggregator Aggregator address
- */
- function onVerifyBatches(
- uint64 lastVerifiedBatch,
- bytes32 newStateRoot,
- address aggregator
- ) public virtual override onlyRollupManager {
- emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator);
- }
-
- ////////////////////////////
- // Force batches functions
- ////////////////////////////
-
- /**
- * @notice Allows a sequencer/user to force a batch of L2 transactions.
- * This should be used only in extreme cases where the trusted sequencer does not work as expected
- * Note The sequencer has certain degree of control on how non-forced and forced batches are ordered
- * In order to assure that users force transactions will be processed properly, user must not sign any other transaction
- * with the same nonce
- * @param transactions L2 ethereum transactions EIP-155 or pre-EIP-155 with signature:
- * @param polAmount Max amount of pol tokens that the sender is willing to pay
- */
- function forceBatch(
- bytes calldata transactions,
- uint256 polAmount
- ) public virtual isSenderAllowedToForceBatches {
- // Check if rollup manager is on emergency state
- if (rollupManager.isEmergencyState()) {
- revert ForceBatchesNotAllowedOnEmergencyState();
- }
-
- // Calculate pol collateral
- uint256 polFee = rollupManager.getForcedBatchFee();
-
- if (polFee > polAmount) {
- revert NotEnoughPOLAmount();
- }
-
- if (transactions.length > _MAX_FORCE_BATCH_BYTE_LENGTH) {
- revert TransactionsLengthAboveMax();
- }
-
- // keep the pol fees on this contract until forced it's sequenced
- pol.safeTransferFrom(msg.sender, address(this), polFee);
-
- // Get globalExitRoot global exit root
- bytes32 lastGlobalExitRoot = globalExitRootManager
- .getLastGlobalExitRoot();
-
- // Update forcedBatches mapping
- lastForceBatch++;
-
- forcedBatches[lastForceBatch] = keccak256(
- abi.encodePacked(
- keccak256(transactions),
- lastGlobalExitRoot,
- uint64(block.timestamp),
- blockhash(block.number - 1)
- )
- );
-
- if (msg.sender == tx.origin) {
- // Getting the calldata from an EOA is easy so no need to put the `transactions` in the event
- emit ForceBatch(lastForceBatch, lastGlobalExitRoot, msg.sender, "");
- } else {
- // Getting internal transaction calldata is complicated (because it requires an archive node)
- // Therefore it's worth it to put the `transactions` in the event, which is easy to query
- emit ForceBatch(
- lastForceBatch,
- lastGlobalExitRoot,
- msg.sender,
- transactions
- );
- }
- }
-
- /**
- * @notice Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period
- * @param batches Struct array which holds the necessary data to append force batches
- */
- function sequenceForceBatches(
- BatchData[] calldata batches
- ) external virtual isSenderAllowedToForceBatches {
- // Check if rollup manager is on emergency state
- if (
- rollupManager.lastDeactivatedEmergencyStateTimestamp() +
- _HALT_AGGREGATION_TIMEOUT >
- block.timestamp
- ) {
- revert HaltTimeoutNotExpiredAfterEmergencyState();
- }
-
- uint256 batchesNum = batches.length;
-
- if (batchesNum == 0) {
- revert SequenceZeroBatches();
- }
-
- if (batchesNum > _MAX_VERIFY_BATCHES) {
- revert ExceedMaxVerifyBatches();
- }
-
- if (
- uint256(lastForceBatchSequenced) + batchesNum >
- uint256(lastForceBatch)
- ) {
- revert ForceBatchesOverflow();
- }
-
- // Store storage variables in memory, to save gas, because will be overrided multiple times
- uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
- bytes32 currentAccInputHash = lastAccInputHash;
-
- // Sequence force batches
- for (uint256 i = 0; i < batchesNum; i++) {
- // Load current sequence
- BatchData memory currentBatch = batches[i];
- currentLastForceBatchSequenced++;
-
- // Store the current transactions hash since it's used more than once for gas saving
- bytes32 currentTransactionsHash = keccak256(
- currentBatch.transactions
- );
-
- // Check forced data matches
- bytes32 hashedForcedBatchData = keccak256(
- abi.encodePacked(
- currentTransactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- currentBatch.forcedBlockHashL1
- )
- );
-
- if (
- hashedForcedBatchData !=
- forcedBatches[currentLastForceBatchSequenced]
- ) {
- revert ForcedDataDoesNotMatch();
- }
-
- // Delete forceBatch data since won't be used anymore
- delete forcedBatches[currentLastForceBatchSequenced];
-
- if (i == (batchesNum - 1)) {
- // The last batch will have the most restrictive timestamp
- if (
- currentBatch.forcedTimestamp + forceBatchTimeout >
- block.timestamp
- ) {
- revert ForceBatchTimeoutNotExpired();
- }
- }
- // Calculate next acc input hash
- currentAccInputHash = keccak256(
- abi.encodePacked(
- currentAccInputHash,
- currentTransactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- msg.sender,
- currentBatch.forcedBlockHashL1
- )
- );
- }
-
- // Transfer pol for every forced batch submitted
- pol.safeTransfer(
- address(rollupManager),
- calculatePolPerForceBatch() * (batchesNum)
- );
-
- // Store back the storage variables
- lastAccInputHash = currentAccInputHash;
- lastForceBatchSequenced = currentLastForceBatchSequenced;
-
- uint64 currentBatchSequenced = rollupManager.onSequenceBatches(
- uint64(batchesNum),
- currentAccInputHash
- );
-
- emit SequenceForceBatches(currentBatchSequenced);
- }
-
- //////////////////
- // admin functions
- //////////////////
-
- /**
- * @notice Allow the admin to set a new trusted sequencer
- * @param newTrustedSequencer Address of the new trusted sequencer
- */
- function setTrustedSequencer(
- address newTrustedSequencer
- ) external onlyAdmin {
- trustedSequencer = newTrustedSequencer;
-
- emit SetTrustedSequencer(newTrustedSequencer);
- }
-
- /**
- * @notice Allow the admin to set the trusted sequencer URL
- * @param newTrustedSequencerURL URL of trusted sequencer
- */
- function setTrustedSequencerURL(
- string memory newTrustedSequencerURL
- ) external onlyAdmin {
- trustedSequencerURL = newTrustedSequencerURL;
-
- emit SetTrustedSequencerURL(newTrustedSequencerURL);
- }
-
- /**
- * @notice Allow the admin to change the force batch address, that will be allowed to force batches
- * If address 0 is set, then everyone is able to force batches, this action is irreversible
- * @param newForceBatchAddress New force batch address
- */
- function setForceBatchAddress(
- address newForceBatchAddress
- ) external onlyAdmin {
- if (forceBatchAddress == address(0)) {
- revert ForceBatchesDecentralized();
- }
- forceBatchAddress = newForceBatchAddress;
-
- emit SetForceBatchAddress(newForceBatchAddress);
- }
-
- /**
- * @notice Allow the admin to set the forcedBatchTimeout
- * The new value can only be lower, except if emergency state is active
- * @param newforceBatchTimeout New force batch timeout
- */
- function setForceBatchTimeout(
- uint64 newforceBatchTimeout
- ) external onlyAdmin {
- if (newforceBatchTimeout > _HALT_AGGREGATION_TIMEOUT) {
- revert InvalidRangeForceBatchTimeout();
- }
-
- if (!rollupManager.isEmergencyState()) {
- if (newforceBatchTimeout >= forceBatchTimeout) {
- revert InvalidRangeForceBatchTimeout();
- }
- }
-
- forceBatchTimeout = newforceBatchTimeout;
- emit SetForceBatchTimeout(newforceBatchTimeout);
- }
-
- /**
- * @notice Starts the admin role transfer
- * This is a two step process, the pending admin must accepted to finalize the process
- * @param newPendingAdmin Address of the new pending admin
- */
- function transferAdminRole(address newPendingAdmin) external onlyAdmin {
- pendingAdmin = newPendingAdmin;
- emit TransferAdminRole(newPendingAdmin);
- }
-
- /**
- * @notice Allow the current pending admin to accept the admin role
- */
- function acceptAdminRole() external {
- if (pendingAdmin != msg.sender) {
- revert OnlyPendingAdmin();
- }
-
- admin = pendingAdmin;
- emit AcceptAdminRole(pendingAdmin);
- }
-
- //////////////////
- // view/pure functions
- //////////////////
-
- /**
- * @notice Function to calculate the reward for a forced batch
- */
- function calculatePolPerForceBatch() public view returns (uint256) {
- uint256 currentBalance = pol.balanceOf(address(this));
-
- // Pending forced Batches = last forced batch added - last forced batch sequenced
- uint256 pendingForcedBatches = lastForceBatch - lastForceBatchSequenced;
-
- if (pendingForcedBatches == 0) return 0;
- return currentBalance / pendingForcedBatches;
- }
-
- /**
- * @notice Generate Initialize transaction for hte bridge on L2
- * @param networkID Indicates the network identifier that will be used in the bridge
- * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup
- * @param _gasTokenNetwork Indicates the native network of the token address
- * @param _gasTokenMetadata Abi encoded gas token metadata
- */
- function generateInitializeTransaction(
- uint32 networkID,
- address _gasTokenAddress,
- uint32 _gasTokenNetwork,
- bytes memory _gasTokenMetadata
- ) public view returns (bytes memory) {
- bytes memory initializeBrigeData = abi.encodeCall(
- IPolygonZkEVMBridgeV2.initialize,
- (
- networkID,
- _gasTokenAddress,
- _gasTokenNetwork,
- GLOBAL_EXIT_ROOT_MANAGER_L2,
- address(0), // Rollup manager on L2 does not exist
- _gasTokenMetadata
- )
- );
-
- bytes memory bytesToSign;
-
- if (_gasTokenMetadata.length == 0) {
- bytesToSign = abi.encodePacked(
- INITIALIZE_TX_BRIDGE_LIST_LEN_LEN,
- uint16(initializeBrigeData.length) +
- INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA, // do not support more than 2 bytes of length, intended to revert on overflow
- INITIALIZE_TX_BRIDGE_PARAMS,
- bridgeAddress,
- INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA,
- INITIALIZE_TX_DATA_LEN_EMPTY_METADATA,
- initializeBrigeData
- );
- } else {
- // Do not support more than 65535 bytes
- if (initializeBrigeData.length > type(uint16).max) {
- revert HugeTokenMetadataNotSupported();
- }
- uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length);
-
- bytesToSign = abi.encodePacked(
- INITIALIZE_TX_BRIDGE_LIST_LEN_LEN,
- uint16(initializeBrigeData.length) +
- INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow
- INITIALIZE_TX_BRIDGE_PARAMS,
- bridgeAddress,
- INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS,
- initializeBrigeDataLen,
- initializeBrigeData
- );
- }
-
- // Sanity check that the ecrecover will work
- // Should never happen that giving a valid signature, ecrecover "breaks"
- address signer = ecrecover(
- keccak256(bytesToSign),
- SIGNATURE_INITIALIZE_TX_V,
- SIGNATURE_INITIALIZE_TX_R,
- SIGNATURE_INITIALIZE_TX_S
- );
-
- if (signer == address(0)) {
- revert InvalidInitializeTransaction();
- }
-
- bytes memory transaction = abi.encodePacked(
- bytesToSign,
- SIGNATURE_INITIALIZE_TX_R,
- SIGNATURE_INITIALIZE_TX_S,
- SIGNATURE_INITIALIZE_TX_V,
- INITIALIZE_TX_EFFECTIVE_PERCENTAGE
- );
-
- return transaction;
- }
-}
diff --git a/contracts/v2/consensus/validium/migration/PolygonValidiumStorageMigration.sol b/contracts/v2/consensus/validium/migration/PolygonValidiumStorageMigration.sol
deleted file mode 100644
index d06284529..000000000
--- a/contracts/v2/consensus/validium/migration/PolygonValidiumStorageMigration.sol
+++ /dev/null
@@ -1,347 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0
-pragma solidity 0.8.20;
-
-import "./PolygonRollupBaseEtrogNoGap.sol";
-import "../../../interfaces/IDataAvailabilityProtocol.sol";
-import "../../../interfaces/IPolygonValidium.sol";
-
-/**
- * Contract responsible for managing the states and the updates of L2 network.
- * There will be a trusted sequencer, which is able to send transactions.
- * Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
- * The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
- * The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
- * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
- * It is advised to use timelocks for the admin address in case of Validium since if can change the dataAvailabilityProtocol
- */
-contract PolygonValidiumStorageMigration is
- PolygonRollupBaseEtrogNoGap,
- IPolygonValidium
-{
- using SafeERC20Upgradeable for IERC20Upgradeable;
-
- /**
- * @notice Struct which will be used to call sequenceBatches
- * @param transactionsHash keccak256 hash of the L2 ethereum transactions EIP-155 or pre-EIP-155 with signature:
- * EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data, chainid, 0, 0,) || v || r || s
- * pre-EIP-155: rlp(nonce, gasprice, gasLimit, to, value, data) || v || r || s
- * @param forcedGlobalExitRoot Global exit root, empty when sequencing a non forced batch
- * @param forcedTimestamp Minimum timestamp of the force batch data, empty when sequencing a non forced batch
- * @param forcedBlockHashL1 blockHash snapshot of the force batch data, empty when sequencing a non forced batch
- */
- struct ValidiumBatchData {
- bytes32 transactionsHash;
- bytes32 forcedGlobalExitRoot;
- uint64 forcedTimestamp;
- bytes32 forcedBlockHashL1;
- }
-
- // Copy and clean the previous storage values to make it storage compatible with the new contracts
-
- // Data Availability Protocol Address
- /// @custom:oz-renamed-from dataAvailabilityProtocol
- IDataAvailabilityProtocol internal _dataAvailabilityProtocol;
-
- // Indicates if sequence with data avialability is allowed
- // This allow the sequencer to post the data and skip the Data comittee
- /// @custom:oz-renamed-from isSequenceWithDataAvailabilityAllowed
- bool internal _isSequenceWithDataAvailabilityAllowed;
-
- /**
- * @dev This empty reserved space is put in place to allow future versions to add new
- * variables without shifting down storage in the inheritance chain.
- */
- uint256[49] private _gap;
-
- // Data Availability Protocol Address
- IDataAvailabilityProtocol public dataAvailabilityProtocol;
-
- // Indicates if sequence with data avialability is allowed
- // This allow the sequencer to post the data and skip the Data comittee
- bool public isSequenceWithDataAvailabilityAllowed;
-
- /**
- * @dev Emitted when the admin updates the data availability protocol
- */
- event SetDataAvailabilityProtocol(address newDataAvailabilityProtocol);
-
- /**
- * @dev Emitted when switch the ability to sequence with data availability
- */
- event SwitchSequenceWithDataAvailability();
-
- /**
- * @param _globalExitRootManager Global exit root manager address
- * @param _pol POL token address
- * @param _bridgeAddress Bridge address
- * @param _rollupManager Global exit root manager address
- */
- constructor(
- IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
- IERC20Upgradeable _pol,
- IPolygonZkEVMBridgeV2 _bridgeAddress,
- PolygonRollupManager _rollupManager
- )
- PolygonRollupBaseEtrogNoGap(
- _globalExitRootManager,
- _pol,
- _bridgeAddress,
- _rollupManager
- )
- {}
-
- // Reinitialize the contract, the call will be done the same transaction the contract is upgraded
- function initializeMigration()
- external
- virtual
- onlyRollupManager
- reinitializer(2)
- {
- // Copy the previous storage slots
- dataAvailabilityProtocol = _dataAvailabilityProtocol;
- isSequenceWithDataAvailabilityAllowed = _isSequenceWithDataAvailabilityAllowed;
-
- // Clean the previous storage slots
- _dataAvailabilityProtocol = IDataAvailabilityProtocol(address(0));
- _isSequenceWithDataAvailabilityAllowed = false;
- }
-
- /////////////////////////////////////
- // Sequence/Verify batches functions
- ////////////////////////////////////
-
- /**
- * @notice Allows a sequencer to send multiple batches
- * @param batches Struct array which holds the necessary data to append new batches to the sequence
- * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
- * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
- * This will be a protection for the sequencer to avoid sending undesired data
- * @param l2Coinbase Address that will receive the fees from L2
- * @param dataAvailabilityMessage Byte array containing the signatures and all the addresses of the committee in ascending order
- * [signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
- * note that each ECDSA signatures are used, therefore each one must be 65 bytes
- * note Pol is not a reentrant token
- */
- function sequenceBatchesValidium(
- ValidiumBatchData[] calldata batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase,
- bytes calldata dataAvailabilityMessage
- ) external onlyTrustedSequencer {
- uint256 batchesNum = batches.length;
- if (batchesNum == 0) {
- revert SequenceZeroBatches();
- }
-
- if (batchesNum > _MAX_VERIFY_BATCHES) {
- revert ExceedMaxVerifyBatches();
- }
-
- // Check max sequence timestamp inside of range
- if (
- uint256(maxSequenceTimestamp) > (block.timestamp + TIMESTAMP_RANGE)
- ) {
- revert MaxTimestampSequenceInvalid();
- }
-
- // Update global exit root if there are new deposits
- bridgeAddress.updateGlobalExitRoot();
-
- // Get global batch variables
- bytes32 l1InfoRoot = globalExitRootManager.getRoot();
-
- // Store storage variables in memory, to save gas, because will be overrided multiple times
- uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
- bytes32 currentAccInputHash = lastAccInputHash;
-
- // Store in a temporal variable, for avoid access again the storage slot
- uint64 initLastForceBatchSequenced = currentLastForceBatchSequenced;
-
- // Accumulated sequenced transaction hash to verify them afterward against the dataAvailabilityProtocol
- bytes32 accumulatedNonForcedTransactionsHash = bytes32(0);
-
- for (uint256 i = 0; i < batchesNum; i++) {
- // Load current sequence
- ValidiumBatchData memory currentBatch = batches[i];
-
- // Check if it's a forced batch
- if (currentBatch.forcedTimestamp > 0) {
- currentLastForceBatchSequenced++;
-
- // Check forced data matches
- bytes32 hashedForcedBatchData = keccak256(
- abi.encodePacked(
- currentBatch.transactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- currentBatch.forcedBlockHashL1
- )
- );
-
- if (
- hashedForcedBatchData !=
- forcedBatches[currentLastForceBatchSequenced]
- ) {
- revert ForcedDataDoesNotMatch();
- }
-
- // Calculate next accumulated input hash
- currentAccInputHash = keccak256(
- abi.encodePacked(
- currentAccInputHash,
- currentBatch.transactionsHash,
- currentBatch.forcedGlobalExitRoot,
- currentBatch.forcedTimestamp,
- l2Coinbase,
- currentBatch.forcedBlockHashL1
- )
- );
-
- // Delete forceBatch data since won't be used anymore
- delete forcedBatches[currentLastForceBatchSequenced];
- } else {
- // Accumulate non forced transactions hash
- accumulatedNonForcedTransactionsHash = keccak256(
- abi.encodePacked(
- accumulatedNonForcedTransactionsHash,
- currentBatch.transactionsHash
- )
- );
-
- // Note that forcedGlobalExitRoot and forcedBlockHashL1 remain unused and unchecked in this path
- // The synchronizer should be aware of that
-
- // Calculate next accumulated input hash
- currentAccInputHash = keccak256(
- abi.encodePacked(
- currentAccInputHash,
- currentBatch.transactionsHash,
- l1InfoRoot,
- maxSequenceTimestamp,
- l2Coinbase,
- bytes32(0)
- )
- );
- }
- }
-
- // Sanity check, should be unreachable
- if (currentLastForceBatchSequenced > lastForceBatch) {
- revert ForceBatchesOverflow();
- }
-
- // Store back the storage variables
- lastAccInputHash = currentAccInputHash;
-
- uint256 nonForcedBatchesSequenced = batchesNum;
-
- // Check if there has been forced batches
- if (currentLastForceBatchSequenced != initLastForceBatchSequenced) {
- uint64 forcedBatchesSequenced = currentLastForceBatchSequenced -
- initLastForceBatchSequenced;
- // substract forced batches
- nonForcedBatchesSequenced -= forcedBatchesSequenced;
-
- // Transfer pol for every forced batch submitted
- pol.safeTransfer(
- address(rollupManager),
- calculatePolPerForceBatch() * (forcedBatchesSequenced)
- );
-
- // Store new last force batch sequenced
- lastForceBatchSequenced = currentLastForceBatchSequenced;
- }
-
- // Pay collateral for every non-forced batch submitted
- if (nonForcedBatchesSequenced != 0) {
- pol.safeTransferFrom(
- msg.sender,
- address(rollupManager),
- rollupManager.getBatchFee() * nonForcedBatchesSequenced
- );
-
- // Validate that the data availability protocol accepts the dataAvailabilityMessage
- // note This is a view function, so there's not much risk even if this contract was vulnerable to reentrant attacks
- dataAvailabilityProtocol.verifyMessage(
- accumulatedNonForcedTransactionsHash,
- dataAvailabilityMessage
- );
- }
-
- uint64 currentBatchSequenced = rollupManager.onSequenceBatches(
- uint64(batchesNum),
- currentAccInputHash
- );
-
- // Check init sequenced batch
- if (
- initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
- ) {
- revert InitSequencedBatchDoesNotMatch();
- }
-
- emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
- }
-
- /**
- * @notice Allows a sequencer to send multiple batches
- * @param batches Struct array which holds the necessary data to append new batches to the sequence
- * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
- * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
- * This will be a protection for the sequencer to avoid sending undesired data
- * @param l2Coinbase Address that will receive the fees from L2
- * note Pol is not a reentrant token
- */
- function sequenceBatches(
- BatchData[] calldata batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase
- ) public override {
- if (!isSequenceWithDataAvailabilityAllowed) {
- revert SequenceWithDataAvailabilityNotAllowed();
- }
- super.sequenceBatches(
- batches,
- maxSequenceTimestamp,
- initSequencedBatch,
- l2Coinbase
- );
- }
-
- //////////////////
- // admin functions
- //////////////////
-
- /**
- * @notice Allow the admin to set a new data availability protocol
- * @param newDataAvailabilityProtocol Address of the new data availability protocol
- */
- function setDataAvailabilityProtocol(
- IDataAvailabilityProtocol newDataAvailabilityProtocol
- ) external onlyAdmin {
- dataAvailabilityProtocol = newDataAvailabilityProtocol;
-
- emit SetDataAvailabilityProtocol(address(newDataAvailabilityProtocol));
- }
-
- /**
- * @notice Allow the admin to switch the sequence with data availability
- * @param newIsSequenceWithDataAvailabilityAllowed Boolean to switch
- */
- function switchSequenceWithDataAvailability(
- bool newIsSequenceWithDataAvailabilityAllowed
- ) external onlyAdmin {
- if (
- newIsSequenceWithDataAvailabilityAllowed ==
- isSequenceWithDataAvailabilityAllowed
- ) {
- revert SwitchToSameValue();
- }
- isSequenceWithDataAvailabilityAllowed = newIsSequenceWithDataAvailabilityAllowed;
- emit SwitchSequenceWithDataAvailability();
- }
-}
diff --git a/contracts/v2/interfaces/IBridgeL2SovereignChains.sol b/contracts/v2/interfaces/IBridgeL2SovereignChains.sol
new file mode 100644
index 000000000..a4b6e9416
--- /dev/null
+++ b/contracts/v2/interfaces/IBridgeL2SovereignChains.sol
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity ^0.8.20;
+import "../../interfaces/IBasePolygonZkEVMGlobalExitRoot.sol";
+import "./IPolygonZkEVMBridgeV2.sol";
+
+interface IBridgeL2SovereignChains is IPolygonZkEVMBridgeV2 {
+ /**
+ * @dev Thrown when try to set a zero address to a non valid zero address field
+ */
+ error InvalidZeroAddress();
+
+ /**
+ * @dev Thrown when the origin network is invalid
+ */
+ error OriginNetworkInvalid();
+
+ /**
+ * @dev Thrown when sender is not the bridge manager
+ * @notice Bridge manager can set custom mapping for any token
+ */
+ error OnlyBridgeManager();
+
+ /**
+ * @dev Thrown when trying to remove a token mapping that has not been updated by a new one
+ */
+ error TokenNotMapped();
+
+ /**
+ * @dev Thrown when trying to migrate a legacy token that is already the current token
+ */
+ error TokenAlreadyUpdated();
+
+ /**
+ * @dev Thrown when initializing sovereign bridge with invalid sovereign WETH token params
+ */
+ error InvalidSovereignWETHAddressParams();
+
+ /**
+ * @dev Thrown when initializing sovereign bridge with invalid sovereign WETH token params
+ */
+ error InvalidInitializeFunction();
+
+ /**
+ * @dev Thrown when initializing calling a function with invalid arrays length
+ */
+ error InputArraysLengthMismatch();
+
+ /**
+ * @dev Thrown when trying to map a token that is already mapped
+ */
+ error TokenAlreadyMapped();
+
+ /**
+ * @dev Thrown when trying to remove a legacy mapped token that has nor previously been remapped
+ */
+ error TokenNotRemapped();
+
+ /**
+ * @dev Thrown when trying to set a custom wrapper for weth on a gas token network
+ */
+ error WETHRemappingNotSupportedOnGasTokenNetworks();
+ /**
+ * @dev Thrown when trying to unset a not setted claim
+ */
+ error ClaimNotSet();
+
+ /**
+ * @dev Thrown when trying to activate emergency state in a not allowed bridge context (e.g. sovereign chains)
+ */
+ error EmergencyStateNotAllowed();
+
+ function initialize(
+ uint32 _networkID,
+ address _gasTokenAddress,
+ uint32 _gasTokenNetwork,
+ IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager,
+ address _polygonRollupManager,
+ bytes memory _gasTokenMetadata,
+ address _bridgeManager,
+ address sovereignWETHAddress,
+ bool _sovereignWETHAddressIsNotMintable
+ ) external;
+}
diff --git a/contracts/v2/interfaces/IPolygonConsensusBase.sol b/contracts/v2/interfaces/IPolygonConsensusBase.sol
new file mode 100644
index 000000000..5ce3a14b2
--- /dev/null
+++ b/contracts/v2/interfaces/IPolygonConsensusBase.sol
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity ^0.8.20;
+
+interface IPolygonConsensusBase {
+ function initialize(
+ address _admin,
+ address sequencer,
+ uint32 networkID,
+ address gasTokenAddress,
+ string memory sequencerURL,
+ string memory _networkName
+ ) external;
+
+ function admin() external view returns (address);
+}
diff --git a/contracts/v2/interfaces/IPolygonPessimisticConsensus.sol b/contracts/v2/interfaces/IPolygonPessimisticConsensus.sol
new file mode 100644
index 000000000..9106d9afc
--- /dev/null
+++ b/contracts/v2/interfaces/IPolygonPessimisticConsensus.sol
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity ^0.8.20;
+
+interface IPolygonPessimisticConsensus {
+ function getConsensusHash() external view returns (bytes32);
+}
diff --git a/contracts/v2/interfaces/IPolygonRollupBase.sol b/contracts/v2/interfaces/IPolygonRollupBase.sol
index cd373f428..e840697c7 100644
--- a/contracts/v2/interfaces/IPolygonRollupBase.sol
+++ b/contracts/v2/interfaces/IPolygonRollupBase.sol
@@ -2,19 +2,17 @@
pragma solidity ^0.8.20;
-interface IPolygonRollupBase {
- function initialize(
- address _admin,
- address sequencer,
- uint32 networkID,
- address gasTokenAddress,
- string memory sequencerURL,
- string memory _networkName
- ) external;
+import "./IPolygonConsensusBase.sol";
+interface IPolygonRollupBase is IPolygonConsensusBase {
function onVerifyBatches(
uint64 lastVerifiedBatch,
bytes32 newStateRoot,
address aggregator
) external;
+
+ function rollbackBatches(
+ uint64 targetBatch,
+ bytes32 accInputHashToRollback
+ ) external;
}
diff --git a/contracts/v2/interfaces/IPolygonRollupManager.sol b/contracts/v2/interfaces/IPolygonRollupManager.sol
index b841f0383..e5848c901 100644
--- a/contracts/v2/interfaces/IPolygonRollupManager.sol
+++ b/contracts/v2/interfaces/IPolygonRollupManager.sol
@@ -2,6 +2,10 @@
pragma solidity ^0.8.20;
+import "../../interfaces/IVerifierRollup.sol";
+import "./IPolygonRollupBase.sol";
+import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts5/proxy/transparent/TransparentUpgradeableProxy.sol";
+
interface IPolygonRollupManager {
/**
* @dev Thrown when sender is not the PolygonZkEVM address
@@ -167,4 +171,260 @@ interface IPolygonRollupManager {
* @dev When adding an existing rollup where the rollup address already was added
*/
error RollupAddressAlreadyExist();
+
+ /**
+ * @dev When verifying proof for multiple roolups and they are not ordered by ID
+ */
+ error RollupIDNotAscendingOrder();
+
+ /**
+ * @dev When try to create a new rollup and set a chainID bigger than 32 bits
+ */
+ error ChainIDOutOfRange();
+
+ /**
+ * @dev When try to upgrade a rollup a sender that's not the admin of the rollup
+ */
+ error OnlyRollupAdmin();
+
+ /**
+ * @dev When try to update a rollup with sequences pending to verify
+ */
+ error AllSequencedMustBeVerified();
+
+ /**
+ * @dev Thrown when do not sequence any blob
+ */
+ error MustSequenceSomeBlob();
+
+ /**
+ * @dev Thrown when the final verification sequence is below or equal the last verification sequence
+ */
+ error FinalNumSequenceBelowLastVerifiedSequence();
+
+ /**
+ * @dev When the init sequence was verified in another forkID
+ */
+ error InitSequenceMustMatchCurrentForkID();
+
+ /**
+ * @dev Thrown when the init num sequence does not match with the one in the pending state
+ */
+ error InitSequenceNumDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when the final num sequence does not match with the one in the pending state
+ */
+ error FinalNumSequenceDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when attempting to set a new multiplier zkgas in a invalid range of values
+ */
+ error InvalidRangeMultiplierZkGasPrice();
+
+ /**
+ * @dev Thrown when attempting to set a seuqnece time target in an invalid range of values
+ */
+ error InvalidRangeSequenceTimeTarget();
+
+ /**
+ * @dev When a set a zkgasprice out of range
+ */
+ error zkGasPriceOfRange();
+
+ /**
+ * @dev Cannot update from network admin with unconsolidated pending state
+ */
+ error CannotUpdateWithUnconsolidatedPendingState();
+
+ /**
+ * @dev Try to verify batches without any sequence data
+ */
+ error EmptyVerifySequencesData();
+
+ /**
+ * @dev Update to old rollup ID
+ */
+ error UpdateToOldRollupTypeID();
+
+ /**
+ * @dev All batches must be verified before the upgrade
+ */
+ error AllBatchesMustBeVerified();
+
+ /**
+ * @dev Rollback batch is not sequenced
+ */
+ error RollbackBatchIsNotValid();
+
+ /**
+ * @dev Rollback batch is not the end of any sequence
+ */
+ error RollbackBatchIsNotEndOfSequence();
+
+ /**
+ * @dev rollbackBatches is called from a non authorized address
+ */
+ error NotAllowedAddress();
+
+ /**
+ * @dev Invalid Rollup type parameters
+ */
+ error InvalidRollupType();
+
+ /**
+ * @dev Invalid Rollup parameters
+ */
+ error InvalidRollup();
+
+ /**
+ * @dev Not valid L1 info tree leaf count
+ */
+ error L1InfoTreeLeafCountInvalid();
+
+ /**
+ * @dev Only State Transition Chains
+ */
+ error OnlyStateTransitionChains();
+
+ /**
+ * @dev Pending state num exist
+ */
+ error PendingStateNumExist();
+
+ /**
+ * @dev Only Chains with Pesismistic proofs
+ */
+ error OnlyChainsWithPessimisticProofs();
+
+ /**
+ * @dev Invalid Pessimistic proof
+ */
+ error InvalidPessimisticProof();
+
+ /**
+ * @dev Invalid Verifier Type when getting rollup data
+ */
+ error InvalidVerifierType();
+
+ enum VerifierType {
+ StateTransition,
+ Pessimistic
+ }
+
+ function addNewRollupType(
+ address consensusImplementation,
+ address verifier,
+ uint64 forkID,
+ VerifierType rollupVerifierType,
+ bytes32 initRoot,
+ string memory description,
+ bytes32 programVKey
+ ) external;
+
+ function obsoleteRollupType(uint32 rollupTypeID) external;
+
+ function createNewRollup(
+ uint32 rollupTypeID,
+ uint64 chainID,
+ address admin,
+ address sequencer,
+ address gasTokenAddress,
+ string memory sequencerURL,
+ string memory networkName
+ ) external;
+
+ function addExistingRollup(
+ IPolygonRollupBase rollupAddress,
+ address verifier,
+ uint64 forkID,
+ uint64 chainID,
+ bytes32 initRoot,
+ VerifierType rollupVerifierType,
+ bytes32 programVKey
+ ) external;
+
+ function updateRollupByRollupAdmin(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID
+ ) external;
+
+ function updateRollup(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes memory upgradeData
+ ) external;
+
+ function rollbackBatches(
+ IPolygonRollupBase rollupContract,
+ uint64 targetBatch
+ ) external;
+
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external returns (uint64);
+
+ function verifyBatchesTrustedAggregator(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) external;
+
+ function verifyPessimisticTrustedAggregator(
+ uint32 rollupID,
+ uint32 l1InfoTreeLeafCount,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot,
+ bytes calldata proof
+ ) external;
+
+ function activateEmergencyState() external;
+
+ function deactivateEmergencyState() external;
+
+ function setBatchFee(uint256 newBatchFee) external;
+
+ function getRollupExitRoot() external view returns (bytes32);
+
+ function getLastVerifiedBatch(
+ uint32 rollupID
+ ) external view returns (uint64);
+
+ function calculateRewardPerBatch() external view returns (uint256);
+
+ function getBatchFee() external view returns (uint256);
+
+ function getForcedBatchFee() external view returns (uint256);
+
+ function getInputPessimisticBytes(
+ uint32 rollupID,
+ bytes32 selectedGlobalExitRoot,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot
+ ) external view returns (bytes memory);
+
+ function getInputSnarkBytes(
+ uint32 rollupID,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) external view returns (bytes memory);
+
+ function getRollupBatchNumToStateRoot(
+ uint32 rollupID,
+ uint64 batchNum
+ ) external view returns (bytes32);
+
+ function lastDeactivatedEmergencyStateTimestamp()
+ external
+ view
+ returns (uint64);
}
diff --git a/contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol b/contracts/v2/interfaces/IPolygonZkEVMEtrogErrors.sol
similarity index 81%
rename from contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol
rename to contracts/v2/interfaces/IPolygonZkEVMEtrogErrors.sol
index 3da4a2a97..ec2161bc7 100644
--- a/contracts/v2/interfaces/IPolygonZkEVMVEtrogErrors.sol
+++ b/contracts/v2/interfaces/IPolygonZkEVMEtrogErrors.sol
@@ -3,7 +3,7 @@
pragma solidity ^0.8.20;
import "../../interfaces/IPolygonZkEVMErrors.sol";
-interface IPolygonZkEVMVEtrogErrors is IPolygonZkEVMErrors {
+interface IPolygonZkEVMEtrogErrors is IPolygonZkEVMErrors {
/**
* @dev Thrown when the caller is not the trusted sequencer
*/
@@ -53,4 +53,14 @@ interface IPolygonZkEVMVEtrogErrors is IPolygonZkEVMErrors {
* @dev Thrown when the max timestamp is out of range
*/
error MaxTimestampSequenceInvalid();
+
+ /**
+ * @dev Thrown when l1 info tree leafCount does not exist
+ */
+ error L1InfoTreeLeafCountInvalid();
+
+ /**
+ * @dev Thrown when the acc input hash does not match the predicted by the sequencer
+ */
+ error FinalAccInputHashDoesNotMatch();
}
diff --git a/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol b/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol
index 3c7b69683..e4110754b 100644
--- a/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol
+++ b/contracts/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.sol
@@ -7,4 +7,8 @@ interface IPolygonZkEVMGlobalExitRootV2 is IBasePolygonZkEVMGlobalExitRoot {
function getLastGlobalExitRoot() external view returns (bytes32);
function getRoot() external view returns (bytes32);
+
+ function l1InfoRootMap(
+ uint32 depositCount
+ ) external view returns (bytes32);
}
diff --git a/contracts/v2/interfaces/ISP1Verifier.sol b/contracts/v2/interfaces/ISP1Verifier.sol
new file mode 100644
index 000000000..154dc7dbb
--- /dev/null
+++ b/contracts/v2/interfaces/ISP1Verifier.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+// imported from: https://github.com/succinctlabs/sp1-contracts/blob/main/contracts/src/ISP1Verifier.sol
+
+/// @title SP1 Verifier Interface
+/// @author Succinct Labs
+/// @notice This contract is the interface for the SP1 Verifier.
+interface ISP1Verifier {
+ /// @notice Verifies a proof with given public values and vkey.
+ /// @dev It is expected that the first 4 bytes of proofBytes must match the first 4 bytes of
+ /// target verifier's VERIFIER_HASH.
+ /// @param programVKey The verification key for the RISC-V program.
+ /// @param publicValues The public values encoded as bytes.
+ /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes.
+ function verifyProof(
+ bytes32 programVKey,
+ bytes calldata publicValues,
+ bytes calldata proofBytes
+ ) external view;
+}
+
+interface ISP1VerifierWithHash is ISP1Verifier {
+ /// @notice Returns the hash of the verifier.
+ function VERIFIER_HASH() external pure returns (bytes32);
+}
\ No newline at end of file
diff --git a/contracts/v2/lib/DepositContractV2.sol b/contracts/v2/lib/DepositContractV2.sol
index 2a2313fec..2606578d2 100644
--- a/contracts/v2/lib/DepositContractV2.sol
+++ b/contracts/v2/lib/DepositContractV2.sol
@@ -13,7 +13,7 @@ contract DepositContractV2 is ReentrancyGuardUpgradeable, DepositContractBase {
* @notice Given the leaf data returns the leaf value
* @param leafType Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message
* @param originNetwork Origin Network
- * @param originAddress [0] Origin token address, 0 address is reserved for ether, [1] msg.sender of the message
+ * @param originAddress [0] Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token, [1] msg.sender of the message
* @param destinationNetwork Destination network
* @param destinationAddress Destination address
* @param amount [0] Amount of tokens/ether, [1] Amount of ether
diff --git a/contracts/v2/lib/PolygonConsensusBase.sol b/contracts/v2/lib/PolygonConsensusBase.sol
new file mode 100644
index 000000000..72284ac3e
--- /dev/null
+++ b/contracts/v2/lib/PolygonConsensusBase.sol
@@ -0,0 +1,222 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity ^0.8.20;
+
+import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
+import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
+import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+import "../../interfaces/IPolygonZkEVMErrors.sol";
+import "../interfaces/IPolygonZkEVMEtrogErrors.sol";
+import "../interfaces/IPolygonConsensusBase.sol";
+import "../interfaces/IPolygonRollupBase.sol";
+import "../interfaces/IPolygonZkEVMBridgeV2.sol";
+import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
+import "./PolygonConstantsBase.sol";
+import "../PolygonRollupManager.sol";
+
+/**
+ * Contract responsible for managing the states and the updates of L2 network.
+ * There will be a trusted sequencer, which is able to send transactions.
+ * Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
+ * The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
+ * The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
+ * To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
+ */
+abstract contract PolygonConsensusBase is
+ Initializable,
+ IPolygonConsensusBase,
+ IPolygonZkEVMEtrogErrors
+{
+ // POL token address
+ IERC20Upgradeable public immutable pol;
+
+ // Global Exit Root interface
+ IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
+
+ // PolygonZkEVM Bridge Address
+ IPolygonZkEVMBridgeV2 public immutable bridgeAddress;
+
+ // Rollup manager
+ PolygonRollupManager public immutable rollupManager;
+
+ // Address that will be able to adjust contract parameters
+ address public admin;
+
+ // This account will be able to accept the admin role
+ address public pendingAdmin;
+
+ // Trusted sequencer address
+ address public trustedSequencer;
+
+ // Trusted sequencer URL
+ string public trustedSequencerURL;
+
+ // L2 network name
+ string public networkName;
+
+ // Current accumulate input hash
+ bytes32 public lastAccInputHash;
+
+ // Queue of forced batches with their associated data
+ // ForceBatchNum --> hashedForcedBatchData
+ // hashedForcedBatchData: hash containing the necessary information to force a batch:
+ // keccak256(keccak256(bytes transactions), bytes32 forcedGlobalExitRoot, unint64 forcedTimestamp, bytes32 forcedBlockHashL1)
+ mapping(uint64 => bytes32) public forcedBatches;
+
+ // Last forced batch
+ uint64 public lastForceBatch;
+
+ // Last forced batch included in the sequence
+ uint64 public lastForceBatchSequenced;
+
+ // Force batch timeout
+ uint64 public forceBatchTimeout;
+
+ // Indicates what address is able to do forced batches
+ // If the address is set to 0, forced batches are open to everyone
+ address public forceBatchAddress;
+
+ // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes
+ address public gasTokenAddress;
+
+ // Native network of the token address of the gas tokena address. This variable it's just for read purposes
+ uint32 public gasTokenNetwork;
+
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ */
+ uint256[50] private _gap;
+
+ /**
+ * @dev Emitted when the admin updates the trusted sequencer address
+ */
+ event SetTrustedSequencer(address newTrustedSequencer);
+
+ /**
+ * @dev Emitted when the admin updates the sequencer URL
+ */
+ event SetTrustedSequencerURL(string newTrustedSequencerURL);
+
+ /**
+ * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin
+ */
+ event TransferAdminRole(address newPendingAdmin);
+
+ /**
+ * @dev Emitted when the pending admin accepts the admin role
+ */
+ event AcceptAdminRole(address newAdmin);
+
+ // General parameters that will have in common all networks that deploys rollup manager
+
+ /**
+ * @param _globalExitRootManager Global exit root manager address
+ * @param _pol POL token address
+ * @param _bridgeAddress Bridge address
+ * @param _rollupManager Global exit root manager address
+ */
+ constructor(
+ IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ IERC20Upgradeable _pol,
+ IPolygonZkEVMBridgeV2 _bridgeAddress,
+ PolygonRollupManager _rollupManager
+ ) {
+ globalExitRootManager = _globalExitRootManager;
+ pol = _pol;
+ bridgeAddress = _bridgeAddress;
+ rollupManager = _rollupManager;
+
+ // Disable initalizers on the implementation following the best practices
+ _disableInitializers();
+ }
+
+ /**
+ * @param _admin Admin address
+ * @param sequencer Trusted sequencer address
+ * @param _gasTokenAddress Indicates the token address in mainnet that will be used as a gas token
+ * Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead
+ * @param sequencerURL Trusted sequencer URL
+ * @param _networkName L2 network name
+ */
+ function initialize(
+ address _admin,
+ address sequencer,
+ uint32, //networkID,
+ address _gasTokenAddress,
+ string memory sequencerURL,
+ string memory _networkName
+ ) external virtual onlyRollupManager initializer {
+ // Set initialize variables
+ admin = _admin;
+ trustedSequencer = sequencer;
+
+ trustedSequencerURL = sequencerURL;
+ networkName = _networkName;
+
+ gasTokenAddress = _gasTokenAddress;
+ }
+
+ modifier onlyAdmin() {
+ if (admin != msg.sender) {
+ revert OnlyAdmin();
+ }
+ _;
+ }
+
+ modifier onlyRollupManager() {
+ if (address(rollupManager) != msg.sender) {
+ revert OnlyRollupManager();
+ }
+ _;
+ }
+
+ //////////////////
+ // admin functions
+ //////////////////
+
+ /**
+ * @notice Allow the admin to set a new trusted sequencer
+ * @param newTrustedSequencer Address of the new trusted sequencer
+ */
+ function setTrustedSequencer(
+ address newTrustedSequencer
+ ) external onlyAdmin {
+ trustedSequencer = newTrustedSequencer;
+
+ emit SetTrustedSequencer(newTrustedSequencer);
+ }
+
+ /**
+ * @notice Allow the admin to set the trusted sequencer URL
+ * @param newTrustedSequencerURL URL of trusted sequencer
+ */
+ function setTrustedSequencerURL(
+ string memory newTrustedSequencerURL
+ ) external onlyAdmin {
+ trustedSequencerURL = newTrustedSequencerURL;
+
+ emit SetTrustedSequencerURL(newTrustedSequencerURL);
+ }
+
+ /**
+ * @notice Starts the admin role transfer
+ * This is a two step process, the pending admin must accepted to finalize the process
+ * @param newPendingAdmin Address of the new pending admin
+ */
+ function transferAdminRole(address newPendingAdmin) external onlyAdmin {
+ pendingAdmin = newPendingAdmin;
+ emit TransferAdminRole(newPendingAdmin);
+ }
+
+ /**
+ * @notice Allow the current pending admin to accept the admin role
+ */
+ function acceptAdminRole() external {
+ if (pendingAdmin != msg.sender) {
+ revert OnlyPendingAdmin();
+ }
+
+ admin = pendingAdmin;
+ emit AcceptAdminRole(pendingAdmin);
+ }
+}
diff --git a/contracts/v2/lib/PolygonRollupBaseEtrog.sol b/contracts/v2/lib/PolygonRollupBaseEtrog.sol
index ce522c995..5700c94d1 100644
--- a/contracts/v2/lib/PolygonRollupBaseEtrog.sol
+++ b/contracts/v2/lib/PolygonRollupBaseEtrog.sol
@@ -3,14 +3,14 @@ pragma solidity ^0.8.20;
import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
-import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../../interfaces/IPolygonZkEVMErrors.sol";
-import "../interfaces/IPolygonZkEVMVEtrogErrors.sol";
+import "../interfaces/IPolygonZkEVMEtrogErrors.sol";
import "../PolygonRollupManager.sol";
import "../interfaces/IPolygonRollupBase.sol";
import "../interfaces/IPolygonZkEVMBridgeV2.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
import "./PolygonConstantsBase.sol";
+import "./PolygonConsensusBase.sol";
/**
* Contract responsible for managing the states and the updates of L2 network.
@@ -21,9 +21,8 @@ import "./PolygonConstantsBase.sol";
* To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
*/
abstract contract PolygonRollupBaseEtrog is
- Initializable,
+ PolygonConsensusBase,
PolygonConstantsBase,
- IPolygonZkEVMVEtrogErrors,
IPolygonRollupBase
{
using SafeERC20Upgradeable for IERC20Upgradeable;
@@ -136,67 +135,6 @@ abstract contract PolygonRollupBaseEtrog is
// Timestamp range that's given to the sequencer as a safety measure to avoid reverts if the transaction is mined to quickly
uint256 public constant TIMESTAMP_RANGE = 36;
- // POL token address
- IERC20Upgradeable public immutable pol;
-
- // Global Exit Root interface
- IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
-
- // PolygonZkEVM Bridge Address
- IPolygonZkEVMBridgeV2 public immutable bridgeAddress;
-
- // Rollup manager
- PolygonRollupManager public immutable rollupManager;
-
- // Address that will be able to adjust contract parameters
- address public admin;
-
- // This account will be able to accept the admin role
- address public pendingAdmin;
-
- // Trusted sequencer address
- address public trustedSequencer;
-
- // Trusted sequencer URL
- string public trustedSequencerURL;
-
- // L2 network name
- string public networkName;
-
- // Current accumulate input hash
- bytes32 public lastAccInputHash;
-
- // Queue of forced batches with their associated data
- // ForceBatchNum --> hashedForcedBatchData
- // hashedForcedBatchData: hash containing the necessary information to force a batch:
- // keccak256(keccak256(bytes transactions), bytes32 forcedGlobalExitRoot, unint64 forcedTimestamp, bytes32 forcedBlockHashL1)
- mapping(uint64 => bytes32) public forcedBatches;
-
- // Last forced batch
- uint64 public lastForceBatch;
-
- // Last forced batch included in the sequence
- uint64 public lastForceBatchSequenced;
-
- // Force batch timeout
- uint64 public forceBatchTimeout;
-
- // Indicates what address is able to do forced batches
- // If the address is set to 0, forced batches are open to everyone
- address public forceBatchAddress;
-
- // Token address that will be used to pay gas fees in this rollup. This variable it's just for read purposes
- address public gasTokenAddress;
-
- // Native network of the token address of the gas tokena address. This variable it's just for read purposes
- uint32 public gasTokenNetwork;
-
- /**
- * @dev This empty reserved space is put in place to allow future versions to add new
- * variables without shifting down storage in the inheritance chain.
- */
- uint256[50] private _gap;
-
/**
* @dev Emitted when the trusted sequencer sends a new batch of transactions
*/
@@ -236,14 +174,12 @@ abstract contract PolygonRollupBaseEtrog is
);
/**
- * @dev Emitted when the admin updates the trusted sequencer address
- */
- event SetTrustedSequencer(address newTrustedSequencer);
-
- /**
- * @dev Emitted when the admin updates the sequencer URL
+ * @dev Emitted when a aggregator verifies batches
*/
- event SetTrustedSequencerURL(string newTrustedSequencerURL);
+ event RollbackBatches(
+ uint64 indexed targetBatch,
+ bytes32 accInputHashToRollback
+ );
/**
* @dev Emitted when the admin update the force batch timeout
@@ -255,16 +191,6 @@ abstract contract PolygonRollupBaseEtrog is
*/
event SetForceBatchAddress(address newForceBatchAddress);
- /**
- * @dev Emitted when the admin starts the two-step transfer role setting a new pending admin
- */
- event TransferAdminRole(address newPendingAdmin);
-
- /**
- * @dev Emitted when the pending admin accepts the admin role
- */
- event AcceptAdminRole(address newAdmin);
-
// General parameters that will have in common all networks that deploys rollup manager
/**
@@ -278,12 +204,14 @@ abstract contract PolygonRollupBaseEtrog is
IERC20Upgradeable _pol,
IPolygonZkEVMBridgeV2 _bridgeAddress,
PolygonRollupManager _rollupManager
- ) {
- globalExitRootManager = _globalExitRootManager;
- pol = _pol;
- bridgeAddress = _bridgeAddress;
- rollupManager = _rollupManager;
- }
+ )
+ PolygonConsensusBase(
+ _globalExitRootManager,
+ _pol,
+ _bridgeAddress,
+ _rollupManager
+ )
+ {}
/**
* @param _admin Admin address
@@ -301,7 +229,12 @@ abstract contract PolygonRollupBaseEtrog is
address _gasTokenAddress,
string memory sequencerURL,
string memory _networkName
- ) external virtual onlyRollupManager initializer {
+ )
+ external
+ override(IPolygonConsensusBase, PolygonConsensusBase)
+ onlyRollupManager
+ initializer
+ {
bytes memory gasTokenMetadata = _verifyOrigin(_gasTokenAddress);
// Sequence transaction to initilize the bridge
@@ -355,13 +288,6 @@ abstract contract PolygonRollupBaseEtrog is
emit InitialSequenceBatches(transaction, lastGlobalExitRoot, sequencer);
}
- modifier onlyAdmin() {
- if (admin != msg.sender) {
- revert OnlyAdmin();
- }
- _;
- }
-
modifier onlyTrustedSequencer() {
if (trustedSequencer != msg.sender) {
revert OnlyTrustedSequencer();
@@ -380,13 +306,6 @@ abstract contract PolygonRollupBaseEtrog is
_;
}
- modifier onlyRollupManager() {
- if (address(rollupManager) != msg.sender) {
- revert OnlyRollupManager();
- }
- _;
- }
-
/////////////////////////////////////
// Sequence/Verify batches functions
////////////////////////////////////
@@ -394,17 +313,19 @@ abstract contract PolygonRollupBaseEtrog is
/**
* @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param l1InfoTreeLeafCount Count of the L1InfoTree leaf that will be used in this sequence
* @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
* This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
- * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * @param expectedFinalAccInputHash This parameter must match the acc input hash after hash all the batch data
* This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
* note Pol is not a reentrant token
*/
function sequenceBatches(
BatchData[] calldata batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase
) public virtual onlyTrustedSequencer {
uint256 batchesNum = batches.length;
@@ -427,7 +348,13 @@ abstract contract PolygonRollupBaseEtrog is
bridgeAddress.updateGlobalExitRoot();
// Get global batch variables
- bytes32 l1InfoRoot = globalExitRootManager.getRoot();
+ bytes32 l1InfoRoot = globalExitRootManager.l1InfoRootMap(
+ l1InfoTreeLeafCount
+ );
+
+ if (l1InfoRoot == bytes32(0)) {
+ revert L1InfoTreeLeafCountInvalid();
+ }
// Store storage variables in memory, to save gas, because will be overrided multiple times
uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
@@ -543,11 +470,9 @@ abstract contract PolygonRollupBaseEtrog is
currentAccInputHash
);
- // Check init sequenced batch
- if (
- initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
- ) {
- revert InitSequencedBatchDoesNotMatch();
+ // Check expectedFinalAccInputHash
+ if (currentAccInputHash != expectedFinalAccInputHash) {
+ revert FinalAccInputHashDoesNotMatch();
}
emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
@@ -567,6 +492,21 @@ abstract contract PolygonRollupBaseEtrog is
emit VerifyBatches(lastVerifiedBatch, newStateRoot, aggregator);
}
+ /**
+ * @notice Callback on rollback batches, can only be called by the rollup manager
+ * @param targetBatch Batch to rollback up to but not including this batch
+ * @param accInputHashToRollback Acc input hash to rollback
+ */
+ function rollbackBatches(
+ uint64 targetBatch,
+ bytes32 accInputHashToRollback
+ ) public virtual override onlyRollupManager {
+ // Rollback the accumulated input hash
+ lastAccInputHash = accInputHashToRollback;
+
+ emit RollbackBatches(targetBatch, accInputHashToRollback);
+ }
+
////////////////////////////
// Force batches functions
////////////////////////////
@@ -746,30 +686,6 @@ abstract contract PolygonRollupBaseEtrog is
// admin functions
//////////////////
- /**
- * @notice Allow the admin to set a new trusted sequencer
- * @param newTrustedSequencer Address of the new trusted sequencer
- */
- function setTrustedSequencer(
- address newTrustedSequencer
- ) external onlyAdmin {
- trustedSequencer = newTrustedSequencer;
-
- emit SetTrustedSequencer(newTrustedSequencer);
- }
-
- /**
- * @notice Allow the admin to set the trusted sequencer URL
- * @param newTrustedSequencerURL URL of trusted sequencer
- */
- function setTrustedSequencerURL(
- string memory newTrustedSequencerURL
- ) external onlyAdmin {
- trustedSequencerURL = newTrustedSequencerURL;
-
- emit SetTrustedSequencerURL(newTrustedSequencerURL);
- }
-
/**
* @notice Allow the admin to change the force batch address, that will be allowed to force batches
* If address 0 is set, then everyone is able to force batches, this action is irreversible
@@ -808,28 +724,6 @@ abstract contract PolygonRollupBaseEtrog is
emit SetForceBatchTimeout(newforceBatchTimeout);
}
- /**
- * @notice Starts the admin role transfer
- * This is a two step process, the pending admin must accepted to finalize the process
- * @param newPendingAdmin Address of the new pending admin
- */
- function transferAdminRole(address newPendingAdmin) external onlyAdmin {
- pendingAdmin = newPendingAdmin;
- emit TransferAdminRole(newPendingAdmin);
- }
-
- /**
- * @notice Allow the current pending admin to accept the admin role
- */
- function acceptAdminRole() external {
- if (pendingAdmin != msg.sender) {
- revert OnlyPendingAdmin();
- }
-
- admin = pendingAdmin;
- emit AcceptAdminRole(pendingAdmin);
- }
-
//////////////////
// view/pure functions
//////////////////
diff --git a/contracts/v2/mocks/BridgeReceiverMock.sol b/contracts/v2/mocks/BridgeReceiverMock.sol
index 11364419b..46beea8dc 100644
--- a/contracts/v2/mocks/BridgeReceiverMock.sol
+++ b/contracts/v2/mocks/BridgeReceiverMock.sol
@@ -59,7 +59,7 @@ contract BridgeReceiverMock {
* @param mainnetExitRoot Mainnet exit root
* @param rollupExitRoot Rollup exit root
* @param originNetwork Origin network
- * @param originTokenAddress Origin token address, 0 address is reserved for ether
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
* @param destinationNetwork Network destination
* @param destinationAddress Address destination
* @param amount Amount of tokens
diff --git a/contracts/v2/mocks/PolygonRollupManagerMock.sol b/contracts/v2/mocks/PolygonRollupManagerMock.sol
index a3de8c046..6d3b7a091 100644
--- a/contracts/v2/mocks/PolygonRollupManagerMock.sol
+++ b/contracts/v2/mocks/PolygonRollupManagerMock.sol
@@ -25,13 +25,13 @@ contract PolygonRollupManagerMock is PolygonRollupManager {
address timelock,
address emergencyCouncil
) external reinitializer(2) {
- pendingStateTimeout = _pendingStateTimeout;
- trustedAggregatorTimeout = _trustedAggregatorTimeout;
+ //pendingStateTimeout = _pendingStateTimeout;
+ //trustedAggregatorTimeout = _trustedAggregatorTimeout;
// Constant deployment variables
_batchFee = 0.1 ether; // 0.1 Matic
- verifyBatchTimeTarget = 30 minutes;
- multiplierBatchFee = 1002;
+ //verifyBatchTimeTarget = 30 minutes;
+ //multiplierBatchFee = 1002;
// Initialize OZ contracts
__AccessControl_init();
@@ -74,8 +74,24 @@ contract PolygonRollupManagerMock is PolygonRollupManager {
// Add local Exit roots;
for (uint256 i = 0; i < localExitRoots.length; i++) {
- rollupIDToRollupData[uint32(i + 1)]
+ _rollupIDToRollupData[uint32(i + 1)]
.lastLocalExitRoot = localExitRoots[i];
}
}
+
+ function exposed_checkStateRootInsidePrime(
+ uint256 newStateRoot
+ ) public pure returns (bool) {
+ return _checkStateRootInsidePrime(newStateRoot);
+ }
+
+ function setRollupData(
+ uint32 rollupID,
+ bytes32 lastLocalExitRoot,
+ bytes32 lastPessimisticRoot
+ ) external {
+ RollupData storage rollup = _rollupIDToRollupData[rollupID];
+ rollup.lastLocalExitRoot = lastLocalExitRoot;
+ rollup.lastPessimisticRoot = lastPessimisticRoot;
+ }
}
diff --git a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol b/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol
deleted file mode 100644
index db05b9edc..000000000
--- a/contracts/v2/mocks/PolygonRollupManagerMockInternalTest.sol
+++ /dev/null
@@ -1,75 +0,0 @@
-// SPDX-License-Identifier: AGPL-3.0
-pragma solidity 0.8.20;
-import "../PolygonRollupManager.sol";
-
-/**
- * PolygonRollupManager Test
- */
-contract PolygonRollupManagerMockInternalTest is PolygonRollupManager {
- /**
- * @param _globalExitRootManager Global exit root manager address
- * @param _pol MATIC token address
- * @param _bridgeAddress Bridge address
- */
- constructor(
- IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
- IERC20Upgradeable _pol,
- IPolygonZkEVMBridge _bridgeAddress
- ) PolygonRollupManager(_globalExitRootManager, _pol, _bridgeAddress) {}
-
- function initialize(
- address trustedAggregator,
- uint64 _pendingStateTimeout,
- uint64 _trustedAggregatorTimeout,
- address admin,
- address timelock,
- address emergencyCouncil,
- PolygonZkEVMExistentEtrog polygonZkEVM,
- IVerifierRollup zkEVMVerifier,
- uint64 zkEVMForkID,
- uint64 zkEVMChainID
- ) external override reinitializer(2) {
- pendingStateTimeout = _pendingStateTimeout;
- trustedAggregatorTimeout = _trustedAggregatorTimeout;
-
- // Constant deployment variables
- _batchFee = 0.1 ether; // 0.1 Matic
- verifyBatchTimeTarget = 30 minutes;
- multiplierBatchFee = 1002;
-
- // Initialize OZ contracts
- __AccessControl_init();
-
- // setup roles
-
- // trusted aggregator role
- _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator);
-
- // Timelock roles
- _setupRole(DEFAULT_ADMIN_ROLE, timelock);
- _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock);
- _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock);
-
- // Even this role can only update to an already added verifier/consensus
- // Could break the compatibility of them, changing the virtual state
- _setupRole(_UPDATE_ROLLUP_ROLE, timelock);
-
- // Admin roles
- _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin);
- _setupRole(_CREATE_ROLLUP_ROLE, admin);
- _setupRole(_STOP_EMERGENCY_ROLE, admin);
- _setupRole(_TWEAK_PARAMETERS_ROLE, admin);
- _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN);
- _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin);
-
- _setupRole(_SET_FEE_ROLE, admin);
-
- // Emergency council roles
- _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN);
- _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil);
- _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil);
-
- // Since it's mock, use admin for everything
- _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
- }
-}
diff --git a/contracts/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.sol b/contracts/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.sol
new file mode 100644
index 000000000..b3da0982b
--- /dev/null
+++ b/contracts/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity 0.8.20;
+import "../PolygonZkEVMGlobalExitRootV2.sol";
+
+/**
+ * PolygonRollupManager mock
+ */
+contract PolygonZkEVMGlobalExitRootV2Mock is PolygonZkEVMGlobalExitRootV2 {
+ /**
+ * @param _rollupManager Rollup manager contract address
+ * @param _bridgeAddress PolygonZkEVMBridge contract address
+ */
+ constructor(
+ address _rollupManager,
+ address _bridgeAddress
+ ) PolygonZkEVMGlobalExitRootV2(_rollupManager, _bridgeAddress) {}
+
+ function injectGER(bytes32 _root, uint32 depositCount) external {
+ globalExitRootMap[_root] = block.timestamp;
+ l1InfoRootMap[depositCount] = _root;
+ }
+}
\ No newline at end of file
diff --git a/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol b/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol
index bb5f932ea..9f72a78e3 100644
--- a/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol
+++ b/contracts/v2/newDeployments/PolygonRollupManagerNotUpgraded.sol
@@ -19,23 +19,13 @@ contract PolygonRollupManagerNotUpgraded is PolygonRollupManager {
function initialize(
address trustedAggregator,
- uint64 _pendingStateTimeout,
- uint64 _trustedAggregatorTimeout,
address admin,
address timelock,
- address emergencyCouncil,
- PolygonZkEVMExistentEtrog /*polygonZkEVM*/,
- IVerifierRollup /*zkEVMVerifier*/,
- uint64 /*zkEVMForkID*/,
- uint64 /*zkEVMChainID*/
- ) external override reinitializer(2) {
- pendingStateTimeout = _pendingStateTimeout;
- trustedAggregatorTimeout = _trustedAggregatorTimeout;
+ address emergencyCouncil
+ ) external reinitializer(2) {
// Constant deployment variables
_batchFee = 0.1 ether; // 0.1 Matic
- verifyBatchTimeTarget = 30 minutes;
- multiplierBatchFee = 1002;
// Initialize OZ contracts
__AccessControl_init();
diff --git a/contracts/v2/periphery/BatchL2DataCreatedRollup.sol b/contracts/v2/periphery/BatchL2DataCreatedRollup.sol
new file mode 100644
index 000000000..f56928b74
--- /dev/null
+++ b/contracts/v2/periphery/BatchL2DataCreatedRollup.sol
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: AGPL-3.0
+pragma solidity ^0.8.20;
+
+import "../lib/PolygonRollupBaseEtrog.sol";
+
+
+// This contract is only used for a specific tool: zkevm-contracts/tools/batchL2DataCreatedRollup.
+// This contract is part of the zkevm-contracts/contracts/v2/lib/PolygonRollupBaseEtrog.sol contract.
+contract BatchL2DataCreatedRollup {
+
+ uint8 public constant INITIALIZE_TX_BRIDGE_LIST_LEN_LEN = 0xf9;
+ bytes public constant INITIALIZE_TX_BRIDGE_PARAMS = hex"80808401c9c38094";
+ uint16 public constant INITIALIZE_TX_CONSTANT_BYTES = 32;
+ bytes public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS =
+ hex"80b9";
+ uint16 public constant INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA = 31;
+ uint8 public constant INITIALIZE_TX_DATA_LEN_EMPTY_METADATA = 228;
+ bytes
+ public constant INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA =
+ hex"80b8";
+
+ uint8 public constant SIGNATURE_INITIALIZE_TX_V = 27;
+ bytes32 public constant SIGNATURE_INITIALIZE_TX_R =
+ 0x00000000000000000000000000000000000000000000000000000005ca1ab1e0;
+ bytes32 public constant SIGNATURE_INITIALIZE_TX_S =
+ 0x000000000000000000000000000000000000000000000000000000005ca1ab1e;
+ bytes1 public constant INITIALIZE_TX_EFFECTIVE_PERCENTAGE = 0xFF;
+ IBasePolygonZkEVMGlobalExitRoot
+ public constant GLOBAL_EXIT_ROOT_MANAGER_L2 =
+ IBasePolygonZkEVMGlobalExitRoot(
+ 0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA
+ );
+
+ /**
+ * @notice Generate Initialize transaction for hte bridge on L2
+ * @param networkID Indicates the network identifier that will be used in the bridge
+ * @param bridgeAddress Indicates the bridge address
+ * @param _gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup
+ * @param _gasTokenNetwork Indicates the native network of the token address
+ * @param _gasTokenMetadata Abi encoded gas token metadata
+ */
+ function generateInitializeTransaction(
+ uint32 networkID,
+ address bridgeAddress,
+ address _gasTokenAddress,
+ uint32 _gasTokenNetwork,
+ bytes memory _gasTokenMetadata
+ ) public view returns (bytes memory) {
+ bytes memory initializeBrigeData = abi.encodeCall(
+ IPolygonZkEVMBridgeV2.initialize,
+ (
+ networkID,
+ _gasTokenAddress,
+ _gasTokenNetwork,
+ GLOBAL_EXIT_ROOT_MANAGER_L2,
+ address(0), // Rollup manager on L2 does not exist
+ _gasTokenMetadata
+ )
+ );
+
+ bytes memory bytesToSign;
+ uint16 initializeBrigeDataLen = uint16(initializeBrigeData.length);
+
+ if (_gasTokenMetadata.length == 0) {
+ bytesToSign = abi.encodePacked(
+ INITIALIZE_TX_BRIDGE_LIST_LEN_LEN,
+ initializeBrigeDataLen +
+ INITIALIZE_TX_CONSTANT_BYTES_EMPTY_METADATA, // do not support more than 2 bytes of length, intended to revert on overflow
+ INITIALIZE_TX_BRIDGE_PARAMS,
+ bridgeAddress,
+ INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS_EMPTY_METADATA,
+ INITIALIZE_TX_DATA_LEN_EMPTY_METADATA,
+ initializeBrigeData
+ );
+ } else {
+ bytesToSign = abi.encodePacked(
+ INITIALIZE_TX_BRIDGE_LIST_LEN_LEN,
+ initializeBrigeDataLen +
+ INITIALIZE_TX_CONSTANT_BYTES, // do not support more than 2 bytes of length, intended to revert on overflow
+ INITIALIZE_TX_BRIDGE_PARAMS,
+ bridgeAddress,
+ INITIALIZE_TX_BRIDGE_PARAMS_AFTER_BRIDGE_ADDRESS,
+ initializeBrigeDataLen,
+ initializeBrigeData
+ );
+ }
+
+ // Sanity check that the ecrecover will work
+ // Should never happen that giving a valid signature, ecrecover "breaks"
+ address signer = ecrecover(
+ keccak256(bytesToSign),
+ SIGNATURE_INITIALIZE_TX_V,
+ SIGNATURE_INITIALIZE_TX_R,
+ SIGNATURE_INITIALIZE_TX_S
+ );
+
+ bytes memory transaction = abi.encodePacked(
+ bytesToSign,
+ SIGNATURE_INITIALIZE_TX_R,
+ SIGNATURE_INITIALIZE_TX_S,
+ SIGNATURE_INITIALIZE_TX_V,
+ INITIALIZE_TX_EFFECTIVE_PERCENTAGE
+ );
+
+ return transaction;
+ }
+}
\ No newline at end of file
diff --git a/contracts/v2/previousVersions/IPolygonRollupBasePrevious.sol b/contracts/v2/previousVersions/IPolygonRollupBasePrevious.sol
new file mode 100644
index 000000000..31ca166d9
--- /dev/null
+++ b/contracts/v2/previousVersions/IPolygonRollupBasePrevious.sol
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity ^0.8.20;
+
+interface IPolygonRollupBasePrevious {
+ function initialize(
+ address _admin,
+ address sequencer,
+ uint32 networkID,
+ address gasTokenAddress,
+ string memory sequencerURL,
+ string memory _networkName
+ ) external;
+
+ function onVerifyBatches(
+ uint64 lastVerifiedBatch,
+ bytes32 newStateRoot,
+ address aggregator
+ ) external;
+
+ function admin() external returns (address);
+}
diff --git a/contracts/v2/previousVersions/IPolygonRollupManagerPrevious.sol b/contracts/v2/previousVersions/IPolygonRollupManagerPrevious.sol
new file mode 100644
index 000000000..cdb66a96f
--- /dev/null
+++ b/contracts/v2/previousVersions/IPolygonRollupManagerPrevious.sol
@@ -0,0 +1,280 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity ^0.8.20;
+
+interface IPolygonRollupManagerPrevious {
+ /**
+ * @dev Thrown when sender is not the PolygonZkEVM address
+ */
+ error UpdateToSameRollupTypeID();
+
+ /**
+ * @dev Thrown when sender is not the PolygonZkEVM address
+ */
+ error RollupMustExist();
+
+ /**
+ * @dev Thrown when sender is not the PolygonZkEVM address
+ */
+ error SenderMustBeRollup();
+
+ /**
+ * @dev Thrown when sender is not the PolygonZkEVM address
+ */
+ error TrustedAggregatorTimeoutNotExpired();
+
+ /**
+ * @dev Thrown when sender is not the PolygonZkEVM address
+ */
+ error ExceedMaxVerifyBatches();
+
+ /**
+ * @dev Thrown when attempting to access a pending state that does not exist
+ */
+ error PendingStateDoesNotExist();
+
+ /**
+ * @dev Thrown when the init num batch does not match with the one in the pending state
+ */
+ error InitNumBatchDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when the old state root of a certain batch does not exist
+ */
+ error OldStateRootDoesNotExist();
+
+ /**
+ * @dev Thrown when the init verification batch is above the last verification batch
+ */
+ error InitNumBatchAboveLastVerifiedBatch();
+
+ /**
+ * @dev Thrown when the final verification batch is below or equal the last verification batch
+ */
+ error FinalNumBatchBelowLastVerifiedBatch();
+
+ /**
+ * @dev Thrown when the zkproof is not valid
+ */
+ error InvalidProof();
+
+ /**
+ * @dev Thrown when attempting to consolidate a pending state not yet consolidable
+ */
+ error PendingStateNotConsolidable();
+
+ /**
+ * @dev Thrown when attempting to consolidate a pending state that is already consolidated or does not exist
+ */
+ error PendingStateInvalid();
+
+ /**
+ * @dev Thrown when the new accumulate input hash does not exist
+ */
+ error NewAccInputHashDoesNotExist();
+
+ /**
+ * @dev Thrown when the new state root is not inside prime
+ */
+ error NewStateRootNotInsidePrime();
+
+ /**
+ * @dev Thrown when the final pending state num is not in a valid range
+ */
+ error FinalPendingStateNumInvalid();
+
+ /**
+ * @dev Thrown when the final num batch does not match with the one in the pending state
+ */
+ error FinalNumBatchDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when the stored root matches the new root proving a different state
+ */
+ error StoredRootMustBeDifferentThanNewRoot();
+
+ /**
+ * @dev Thrown when the halt timeout is not expired when attempting to activate the emergency state
+ */
+ error HaltTimeoutNotExpired();
+
+ /**
+ * @dev Thrown when the old accumulate input hash does not exist
+ */
+ error OldAccInputHashDoesNotExist();
+
+ /**
+ * @dev Thrown when attempting to set a new trusted aggregator timeout equal or bigger than current one
+ */
+ error NewTrustedAggregatorTimeoutMustBeLower();
+
+ /**
+ * @dev Thrown when attempting to set a new pending state timeout equal or bigger than current one
+ */
+ error NewPendingStateTimeoutMustBeLower();
+
+ /**
+ * @dev Thrown when attempting to set a new multiplier batch fee in a invalid range of values
+ */
+ error InvalidRangeMultiplierBatchFee();
+
+ /**
+ * @dev Thrown when attempting to set a batch time target in an invalid range of values
+ */
+ error InvalidRangeBatchTimeTarget();
+
+ /**
+ * @dev Thrown when the caller is not the pending admin
+ */
+ error ChainIDAlreadyExist();
+
+ /**
+ * @dev Thrown when the caller is not the pending admin
+ */
+ error MustSequenceSomeBatch();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error RollupTypeDoesNotExist();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error RollupTypeObsolete();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error InitBatchMustMatchCurrentForkID();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error UpdateNotCompatible();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error BatchFeeOutOfRange();
+
+ /**
+ * @dev When a rollup type does not exist
+ */
+ error AllzkEVMSequencedBatchesMustBeVerified();
+
+ /**
+ * @dev When adding an existing rollup where the rollup address already was added
+ */
+ error RollupAddressAlreadyExist();
+
+ /**
+ * @dev When verifying proof for multiple roolups and they are not ordered by ID
+ */
+ error RollupIDNotAscendingOrder();
+
+ /**
+ * @dev When try to create a new rollup and set a chainID bigger than 32 bits
+ */
+ error ChainIDOutOfRange();
+
+ /**
+ * @dev When try to upgrade a rollup a sender that's not the admin of the rollup
+ */
+ error OnlyRollupAdmin();
+
+ /**
+ * @dev When try to update a rollup with sequences pending to verify
+ */
+ error AllSequencedMustBeVerified();
+
+ /**
+ * @dev Thrown when do not sequence any blob
+ */
+ error MustSequenceSomeBlob();
+
+ /**
+ * @dev Thrown when the final verification sequence is below or equal the last verification sequence
+ */
+ error FinalNumSequenceBelowLastVerifiedSequence();
+
+ /**
+ * @dev When the init sequence was verified in another forkID
+ */
+ error InitSequenceMustMatchCurrentForkID();
+
+ /**
+ * @dev Thrown when the init num sequence does not match with the one in the pending state
+ */
+ error InitSequenceNumDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when the final num sequence does not match with the one in the pending state
+ */
+ error FinalNumSequenceDoesNotMatchPendingState();
+
+ /**
+ * @dev Thrown when attempting to set a new multiplier zkgas in a invalid range of values
+ */
+ error InvalidRangeMultiplierZkGasPrice();
+
+ /**
+ * @dev Thrown when attempting to set a seuqnece time target in an invalid range of values
+ */
+ error InvalidRangeSequenceTimeTarget();
+
+ /**
+ * @dev When a set a zkgasprice out of range
+ */
+ error zkGasPriceOfRange();
+
+ /**
+ * @dev Cannot update from network admin with unconsolidated pending state
+ */
+ error CannotUpdateWithUnconsolidatedPendingState();
+
+ /**
+ * @dev Try to verify batches without any sequence data
+ */
+ error EmptyVerifySequencesData();
+
+ /**
+ * @dev Update to old rollup ID
+ */
+ error UpdateToOldRollupTypeID();
+
+ /**
+ * @dev All batches must be verified before the upgrade
+ */
+ error AllBatchesMustBeVerified();
+
+ /**
+ * @dev Rollback batch is not sequenced
+ */
+ error RollbackBatchIsNotValid();
+
+ /**
+ * @dev Rollback batch is not the end of any sequence
+ */
+ error RollbackBatchIsNotEndOfSequence();
+
+ /**
+ * @dev rollbackBatches is called from a non authorized address
+ */
+ error NotAllowedAddress();
+
+ /**
+ * @dev Invalid Rollup type parameters
+ */
+ error InvalidRollupType();
+
+ /**
+ * @dev Invalid Rollup parameters
+ */
+ error InvalidRollup();
+
+ /**
+ * @dev Global exit root does not exists
+ */
+ error GlobalExitRootNotExist();
+}
diff --git a/contracts/v2/previousVersions/PolygonRollupBaseEtrogPrevious.sol b/contracts/v2/previousVersions/PolygonRollupBaseEtrogPrevious.sol
index aa31fb84a..8728c2204 100644
--- a/contracts/v2/previousVersions/PolygonRollupBaseEtrogPrevious.sol
+++ b/contracts/v2/previousVersions/PolygonRollupBaseEtrogPrevious.sol
@@ -5,9 +5,9 @@ import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeab
import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "../../interfaces/IPolygonZkEVMErrors.sol";
-import "../interfaces/IPolygonZkEVMVEtrogErrors.sol";
+import "../interfaces/IPolygonZkEVMEtrogErrors.sol";
import "../PolygonRollupManager.sol";
-import "../interfaces/IPolygonRollupBase.sol";
+import "./IPolygonRollupBasePrevious.sol";
import "../interfaces/IPolygonZkEVMBridgeV2.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
import "../lib/PolygonConstantsBase.sol";
@@ -20,11 +20,11 @@ import "../lib/PolygonConstantsBase.sol";
* The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
* To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
*/
-contract PolygonRollupBaseEtrogPrevious is
+abstract contract PolygonRollupBaseEtrogPrevious is
Initializable,
PolygonConstantsBase,
- IPolygonZkEVMVEtrogErrors,
- IPolygonRollupBase
+ IPolygonZkEVMEtrogErrors,
+ IPolygonRollupBasePrevious
{
using SafeERC20Upgradeable for IERC20Upgradeable;
@@ -133,6 +133,9 @@ contract PolygonRollupBaseEtrogPrevious is
0xa40D5f56745a118D0906a34E69aeC8C0Db1cB8fA
);
+ // Timestamp range that's given to the sequencer as a safety measure to avoid reverts if the transaction is mined to quickly
+ uint256 public constant TIMESTAMP_RANGE = 36;
+
// POL token address
IERC20Upgradeable public immutable pol;
@@ -188,6 +191,12 @@ contract PolygonRollupBaseEtrogPrevious is
// Native network of the token address of the gas tokena address. This variable it's just for read purposes
uint32 public gasTokenNetwork;
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ */
+ uint256[50] private _gap;
+
/**
* @dev Emitted when the trusted sequencer sends a new batch of transactions
*/
@@ -274,6 +283,9 @@ contract PolygonRollupBaseEtrogPrevious is
pol = _pol;
bridgeAddress = _bridgeAddress;
rollupManager = _rollupManager;
+
+ // Disable initalizers on the implementation following the best practices
+ _disableInitializers();
}
/**
@@ -293,29 +305,8 @@ contract PolygonRollupBaseEtrogPrevious is
string memory sequencerURL,
string memory _networkName
) external virtual onlyRollupManager initializer {
- bytes memory gasTokenMetadata;
+ bytes memory gasTokenMetadata = _verifyOrigin(_gasTokenAddress);
- if (_gasTokenAddress != address(0)) {
- // Ask for token metadata, the same way is enconded in the bridge
- // Note that this function will revert if the token is not in this network
- // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call
- gasTokenMetadata = bridgeAddress.getTokenMetadata(_gasTokenAddress);
-
- // Check gas token address on the bridge
- (
- uint32 originWrappedNetwork,
- address originWrappedAddress
- ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress);
-
- if (originWrappedNetwork != 0) {
- // It's a wrapped token, get the wrapped parameters
- gasTokenAddress = originWrappedAddress;
- gasTokenNetwork = originWrappedNetwork;
- } else {
- // gasTokenNetwork will be mainnet, for instance 0
- gasTokenAddress = _gasTokenAddress;
- }
- }
// Sequence transaction to initilize the bridge
// Calculate transaction to initialize the bridge
@@ -406,11 +397,17 @@ contract PolygonRollupBaseEtrogPrevious is
/**
* @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+ * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+ * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
* note Pol is not a reentrant token
*/
function sequenceBatches(
BatchData[] calldata batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase
) public virtual onlyTrustedSequencer {
uint256 batchesNum = batches.length;
@@ -422,12 +419,18 @@ contract PolygonRollupBaseEtrogPrevious is
revert ExceedMaxVerifyBatches();
}
+ // Check max sequence timestamp inside of range
+ if (
+ uint256(maxSequenceTimestamp) > (block.timestamp + TIMESTAMP_RANGE)
+ ) {
+ revert MaxTimestampSequenceInvalid();
+ }
+
// Update global exit root if there are new deposits
bridgeAddress.updateGlobalExitRoot();
// Get global batch variables
bytes32 l1InfoRoot = globalExitRootManager.getRoot();
- uint64 currentTimestamp = uint64(block.timestamp);
// Store storage variables in memory, to save gas, because will be overrided multiple times
uint64 currentLastForceBatchSequenced = lastForceBatchSequenced;
@@ -496,7 +499,7 @@ contract PolygonRollupBaseEtrogPrevious is
currentAccInputHash,
currentTransactionsHash,
l1InfoRoot,
- currentTimestamp,
+ maxSequenceTimestamp,
l2Coinbase,
bytes32(0)
)
@@ -543,6 +546,13 @@ contract PolygonRollupBaseEtrogPrevious is
currentAccInputHash
);
+ // Check init sequenced batch
+ if (
+ initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
+ ) {
+ revert InitSequencedBatchDoesNotMatch();
+ }
+
emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
}
@@ -920,4 +930,30 @@ contract PolygonRollupBaseEtrogPrevious is
return transaction;
}
+
+ function _verifyOrigin(
+ address _gasTokenAddress
+ ) internal virtual returns (bytes memory gasTokenMetadata) {
+ if (_gasTokenAddress != address(0)) {
+ // Ask for token metadata, the same way is enconded in the bridge
+ // Note that this function will revert if the token is not in this network
+ // Note that this could be a possible reentrant call, but cannot make changes on the state since are static call
+ gasTokenMetadata = bridgeAddress.getTokenMetadata(_gasTokenAddress);
+
+ // Check gas token address on the bridge
+ (
+ uint32 originWrappedNetwork,
+ address originWrappedAddress
+ ) = bridgeAddress.wrappedTokenToTokenInfo(_gasTokenAddress);
+
+ if (originWrappedNetwork != 0) {
+ // It's a wrapped token, get the wrapped parameters
+ gasTokenAddress = originWrappedAddress;
+ gasTokenNetwork = originWrappedNetwork;
+ } else {
+ // gasTokenNetwork will be mainnet, for instance 0
+ gasTokenAddress = _gasTokenAddress;
+ }
+ }
+ }
}
diff --git a/contracts/v2/previousVersions/PolygonRollupManagerPrevious.sol b/contracts/v2/previousVersions/PolygonRollupManagerPrevious.sol
new file mode 100644
index 000000000..2a498433b
--- /dev/null
+++ b/contracts/v2/previousVersions/PolygonRollupManagerPrevious.sol
@@ -0,0 +1,1957 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity 0.8.20;
+
+import "./IPolygonRollupManagerPrevious.sol";
+import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
+import "../../interfaces/IPolygonZkEVMBridge.sol";
+import "../interfaces/IPolygonRollupBase.sol";
+import "../../interfaces/IVerifierRollup.sol";
+import "../../lib/EmergencyManager.sol";
+import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
+import "../lib/PolygonTransparentProxy.sol";
+import "../lib/PolygonAccessControlUpgradeable.sol";
+import "../lib/LegacyZKEVMStateVariables.sol";
+import "../consensus/zkEVM/PolygonZkEVMExistentEtrog.sol";
+import "../lib/PolygonConstantsBase.sol";
+
+/**
+ * Contract responsible for managing rollups and the verification of their batches.
+ * This contract will create and update rollups and store all the hashed sequenced data from them.
+ * The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of
+ * them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future.
+ */
+contract PolygonRollupManagerPrevious is
+ PolygonAccessControlUpgradeable,
+ EmergencyManager,
+ LegacyZKEVMStateVariables,
+ PolygonConstantsBase,
+ IPolygonRollupManagerPrevious
+{
+ using SafeERC20Upgradeable for IERC20Upgradeable;
+
+ /**
+ * @notice Struct which to store the rollup type data
+ * @param consensusImplementation Consensus implementation ( contains the consensus logic for the transaparent proxy)
+ * @param verifier verifier
+ * @param forkID fork ID
+ * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types
+ * @param obsolete Indicates if the rollup type is obsolete
+ * @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them
+ */
+ struct RollupType {
+ address consensusImplementation;
+ IVerifierRollup verifier;
+ uint64 forkID;
+ uint8 rollupCompatibilityID;
+ bool obsolete;
+ bytes32 genesis;
+ }
+
+ /**
+ * @notice Struct which to store the rollup data of each chain
+ * @param rollupContract Rollup consensus contract, which manages everything
+ * related to sequencing transactions
+ * @param chainID Chain ID of the rollup
+ * @param verifier Verifier contract
+ * @param forkID ForkID of the rollup
+ * @param batchNumToStateRoot State root mapping
+ * @param sequencedBatches Queue of batches that defines the virtual state
+ * @param pendingStateTransitions Pending state mapping
+ * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot
+ * @param lastBatchSequenced Last batch sent by the consensus contract
+ * @param lastVerifiedBatch Last batch verified
+ * @param lastPendingState Last pending state
+ * @param lastPendingStateConsolidated Last pending state consolidated
+ * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade
+ * @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup
+ * @param rollupCompatibilityID Rollup ID used for compatibility checks when upgrading
+ */
+ struct RollupData {
+ IPolygonRollupBase rollupContract;
+ uint64 chainID;
+ IVerifierRollup verifier;
+ uint64 forkID;
+ mapping(uint64 batchNum => bytes32) batchNumToStateRoot;
+ mapping(uint64 batchNum => SequencedBatchData) sequencedBatches;
+ mapping(uint256 pendingStateNum => PendingState) pendingStateTransitions;
+ bytes32 lastLocalExitRoot;
+ uint64 lastBatchSequenced;
+ uint64 lastVerifiedBatch;
+ uint64 lastPendingState;
+ uint64 lastPendingStateConsolidated;
+ uint64 lastVerifiedBatchBeforeUpgrade;
+ uint64 rollupTypeID;
+ uint8 rollupCompatibilityID;
+ }
+
+ // Modulus zkSNARK
+ uint256 internal constant _RFIELD =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+
+ // Max batch multiplier per verification
+ uint256 internal constant _MAX_BATCH_MULTIPLIER = 12;
+
+ // Max batch fee value
+ uint256 internal constant _MAX_BATCH_FEE = 1000 ether;
+
+ // Min value batch fee
+ uint256 internal constant _MIN_BATCH_FEE = 1 gwei;
+
+ // Goldilocks prime field
+ uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1
+
+ // Max uint64
+ uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF
+
+ // Exit merkle tree levels
+ uint256 internal constant _EXIT_TREE_DEPTH = 32;
+
+ // Roles
+
+ // Be able to add a new rollup type
+ bytes32 internal constant _ADD_ROLLUP_TYPE_ROLE =
+ keccak256("ADD_ROLLUP_TYPE_ROLE");
+
+ // Be able to obsolete a rollup type, which means that new rollups cannot use this type
+ bytes32 internal constant _OBSOLETE_ROLLUP_TYPE_ROLE =
+ keccak256("OBSOLETE_ROLLUP_TYPE_ROLE");
+
+ // Be able to create a new rollup using a rollup type
+ bytes32 internal constant _CREATE_ROLLUP_ROLE =
+ keccak256("CREATE_ROLLUP_ROLE");
+
+ // Be able to create a new rollup which does not have to follow any rollup type.
+ // Also sets the genesis block for that network
+ bytes32 internal constant _ADD_EXISTING_ROLLUP_ROLE =
+ keccak256("ADD_EXISTING_ROLLUP_ROLE");
+
+ // Be able to update a rollup to a new rollup type that it's compatible
+ bytes32 internal constant _UPDATE_ROLLUP_ROLE =
+ keccak256("UPDATE_ROLLUP_ROLE");
+
+ // Be able to that has priority to verify batches and consolidates the state instantly
+ bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE =
+ keccak256("TRUSTED_AGGREGATOR_ROLE");
+
+ // Be able to set the trusted aggregator address
+ bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE_ADMIN =
+ keccak256("TRUSTED_AGGREGATOR_ROLE_ADMIN");
+
+ // Be able to tweak parameters
+ bytes32 internal constant _TWEAK_PARAMETERS_ROLE =
+ keccak256("TWEAK_PARAMETERS_ROLE");
+
+ // Be able to set the current batch fee
+ bytes32 internal constant _SET_FEE_ROLE = keccak256("SET_FEE_ROLE");
+
+ // Be able to stop the emergency state
+ bytes32 internal constant _STOP_EMERGENCY_ROLE =
+ keccak256("STOP_EMERGENCY_ROLE");
+
+ // Be able to activate the emergency state without any further condition
+ bytes32 internal constant _EMERGENCY_COUNCIL_ROLE =
+ keccak256("EMERGENCY_COUNCIL_ROLE");
+
+ // Be able to set the emergency council address
+ bytes32 internal constant _EMERGENCY_COUNCIL_ADMIN =
+ keccak256("EMERGENCY_COUNCIL_ADMIN");
+
+ // Global Exit Root address
+ IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
+
+ // PolygonZkEVM Bridge Address
+ IPolygonZkEVMBridge public immutable bridgeAddress;
+
+ // POL token address
+ IERC20Upgradeable public immutable pol;
+
+ // Number of rollup types added, every new type will be assigned sequencially a new ID
+ uint32 public rollupTypeCount;
+
+ // Rollup type mapping
+ mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap;
+
+ // Number of rollups added, every new rollup will be assigned sequencially a new ID
+ uint32 public rollupCount;
+
+ // Rollups ID mapping
+ mapping(uint32 rollupID => RollupData) public rollupIDToRollupData;
+
+ // Rollups address mapping
+ mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID;
+
+ // Chain ID mapping for nullifying
+ // note we will take care to avoid that current known chainIDs are not reused in our networks (example: 1)
+ mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID;
+
+ // Total sequenced batches across all rollups
+ uint64 public totalSequencedBatches;
+
+ // Total verified batches across all rollups
+ uint64 public totalVerifiedBatches;
+
+ // Last timestamp when an aggregation happen
+ uint64 public lastAggregationTimestamp;
+
+ // Trusted aggregator timeout, if a sequence is not verified in this time frame,
+ // everyone can verify that sequence
+ uint64 public trustedAggregatorTimeout;
+
+ // Once a pending state exceeds this timeout it can be consolidated
+ uint64 public pendingStateTimeout;
+
+ // Time target of the verification of a batch
+ // Adaptively the batchFee will be updated to achieve this target
+ uint64 public verifyBatchTimeTarget;
+
+ // Batch fee multiplier with 3 decimals that goes from 1000 - 1023
+ uint16 public multiplierBatchFee;
+
+ // Current POL fee per batch sequenced
+ // note This variable is internal, since the view function getBatchFee is likely to be upgraded
+ uint256 internal _batchFee;
+
+ // Timestamp when the last emergency state was deactivated
+ uint64 public lastDeactivatedEmergencyStateTimestamp;
+
+ /**
+ * @dev Emitted when a new rollup type is added
+ */
+ event AddNewRollupType(
+ uint32 indexed rollupTypeID,
+ address consensusImplementation,
+ address verifier,
+ uint64 forkID,
+ uint8 rollupCompatibilityID,
+ bytes32 genesis,
+ string description
+ );
+
+ /**
+ * @dev Emitted when a a rolup type is obsoleted
+ */
+ event ObsoleteRollupType(uint32 indexed rollupTypeID);
+
+ /**
+ * @dev Emitted when a new rollup is created based on a rollupType
+ */
+ event CreateNewRollup(
+ uint32 indexed rollupID,
+ uint32 rollupTypeID,
+ address rollupAddress,
+ uint64 chainID,
+ address gasTokenAddress
+ );
+
+ /**
+ * @dev Emitted when an existing rollup is added
+ */
+ event AddExistingRollup(
+ uint32 indexed rollupID,
+ uint64 forkID,
+ address rollupAddress,
+ uint64 chainID,
+ uint8 rollupCompatibilityID,
+ uint64 lastVerifiedBatchBeforeUpgrade
+ );
+
+ /**
+ * @dev Emitted when a rollup is udpated
+ */
+ event UpdateRollup(
+ uint32 indexed rollupID,
+ uint32 newRollupTypeID,
+ uint64 lastVerifiedBatchBeforeUpgrade
+ );
+
+ /**
+ * @dev Emitted when a new verifier is added
+ */
+ event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced);
+
+ /**
+ * @dev Emitted when an aggregator verifies batches
+ */
+ event VerifyBatches(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address indexed aggregator
+ );
+
+ /**
+ * @dev Emitted when the trusted aggregator verifies batches
+ */
+ event VerifyBatchesTrustedAggregator(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address indexed aggregator
+ );
+
+ /**
+ * @dev Emitted when pending state is consolidated
+ */
+ event ConsolidatePendingState(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ uint64 pendingStateNum
+ );
+
+ /**
+ * @dev Emitted when is proved a different state given the same batches
+ */
+ event ProveNonDeterministicPendingState(
+ bytes32 storedStateRoot,
+ bytes32 provedStateRoot
+ );
+
+ /**
+ * @dev Emitted when the trusted aggregator overrides pending state
+ */
+ event OverridePendingState(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address aggregator
+ );
+
+ /**
+ * @dev Emitted when rollback batches
+ */
+ event RollbackBatches(
+ uint32 indexed rollupID,
+ uint64 indexed targetBatch,
+ bytes32 accInputHashToRollback
+ );
+
+ /**
+ * @dev Emitted when is updated the trusted aggregator timeout
+ */
+ event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout);
+
+ /**
+ * @dev Emitted when is updated the pending state timeout
+ */
+ event SetPendingStateTimeout(uint64 newPendingStateTimeout);
+
+ /**
+ * @dev Emitted when is updated the multiplier batch fee
+ */
+ event SetMultiplierBatchFee(uint16 newMultiplierBatchFee);
+
+ /**
+ * @dev Emitted when is updated the verify batch timeout
+ */
+ event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget);
+
+ /**
+ * @dev Emitted when is updated the trusted aggregator address
+ */
+ event SetTrustedAggregator(address newTrustedAggregator);
+
+ /**
+ * @dev Emitted when is updated the batch fee
+ */
+ event SetBatchFee(uint256 newBatchFee);
+
+ /**
+ * @param _globalExitRootManager Global exit root manager address
+ * @param _pol POL token address
+ * @param _bridgeAddress Bridge address
+ */
+ constructor(
+ IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ IERC20Upgradeable _pol,
+ IPolygonZkEVMBridge _bridgeAddress
+ ) {
+ globalExitRootManager = _globalExitRootManager;
+ pol = _pol;
+ bridgeAddress = _bridgeAddress;
+
+ // Disable initalizers on the implementation following the best practices
+ _disableInitializers();
+ }
+
+ ///////////////////////////////////////
+ // Rollups management functions
+ ///////////////////////////////////////
+
+ /**
+ * @notice Add a new rollup type
+ * @param consensusImplementation Consensus implementation
+ * @param verifier Verifier address
+ * @param forkID ForkID of the verifier
+ * @param genesis Genesis block of the rollup
+ * @param description Description of the rollup type
+ */
+ function addNewRollupType(
+ address consensusImplementation,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint8 rollupCompatibilityID,
+ bytes32 genesis,
+ string memory description
+ ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) {
+ uint32 rollupTypeID = ++rollupTypeCount;
+
+ rollupTypeMap[rollupTypeID] = RollupType({
+ consensusImplementation: consensusImplementation,
+ verifier: verifier,
+ forkID: forkID,
+ rollupCompatibilityID: rollupCompatibilityID,
+ obsolete: false,
+ genesis: genesis
+ });
+
+ emit AddNewRollupType(
+ rollupTypeID,
+ consensusImplementation,
+ address(verifier),
+ forkID,
+ rollupCompatibilityID,
+ genesis,
+ description
+ );
+ }
+
+ /**
+ * @notice Obsolete Rollup type
+ * @param rollupTypeID Rollup type to obsolete
+ */
+ function obsoleteRollupType(
+ uint32 rollupTypeID
+ ) external onlyRole(_OBSOLETE_ROLLUP_TYPE_ROLE) {
+ // Check that rollup type exists
+ if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check rollup type is not obsolete
+ RollupType storage currentRollupType = rollupTypeMap[rollupTypeID];
+ if (currentRollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ currentRollupType.obsolete = true;
+
+ emit ObsoleteRollupType(rollupTypeID);
+ }
+
+ /**
+ * @notice Create a new rollup
+ * @param rollupTypeID Rollup type to deploy
+ * @param chainID ChainID of the rollup, must be a new one, can not have more than 32 bits
+ * @param admin Admin of the new created rollup
+ * @param sequencer Sequencer of the new created rollup
+ * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup
+ * Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead
+ * @param sequencerURL Sequencer URL of the new created rollup
+ * @param networkName Network name of the new created rollup
+ */
+ function createNewRollup(
+ uint32 rollupTypeID,
+ uint64 chainID,
+ address admin,
+ address sequencer,
+ address gasTokenAddress,
+ string memory sequencerURL,
+ string memory networkName
+ ) external onlyRole(_CREATE_ROLLUP_ROLE) {
+ // Check that rollup type exists
+ if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check rollup type is not obsolete
+ RollupType storage rollupType = rollupTypeMap[rollupTypeID];
+ if (rollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ // check chainID max value
+ // Currently we have this limitation by the circuit, might be removed in a future
+ if (chainID > type(uint32).max) {
+ revert ChainIDOutOfRange();
+ }
+
+ // Check chainID nullifier
+ if (chainIDToRollupID[chainID] != 0) {
+ revert ChainIDAlreadyExist();
+ }
+
+ // Create a new Rollup, using a transparent proxy pattern
+ // Consensus will be the implementation, and this contract the admin
+ uint32 rollupID = ++rollupCount;
+ address rollupAddress = address(
+ new PolygonTransparentProxy(
+ rollupType.consensusImplementation,
+ address(this),
+ new bytes(0)
+ )
+ );
+
+ // Set chainID nullifier
+ chainIDToRollupID[chainID] = rollupID;
+
+ // Store rollup data
+ rollupAddressToID[rollupAddress] = rollupID;
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ rollup.rollupContract = IPolygonRollupBase(rollupAddress);
+ rollup.forkID = rollupType.forkID;
+ rollup.verifier = rollupType.verifier;
+ rollup.chainID = chainID;
+ rollup.batchNumToStateRoot[0] = rollupType.genesis;
+ rollup.rollupTypeID = rollupTypeID;
+ rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID;
+
+ emit CreateNewRollup(
+ rollupID,
+ rollupTypeID,
+ rollupAddress,
+ chainID,
+ gasTokenAddress
+ );
+
+ // Initialize new rollup
+ IPolygonRollupBase(rollupAddress).initialize(
+ admin,
+ sequencer,
+ rollupID,
+ gasTokenAddress,
+ sequencerURL,
+ networkName
+ );
+ }
+
+ /**
+ * @notice Add an already deployed rollup
+ * note that this rollup does not follow any rollupType
+ * @param rollupAddress Rollup address
+ * @param verifier Verifier address, must be added before
+ * @param forkID Fork id of the added rollup
+ * @param chainID Chain id of the added rollup
+ * @param genesis Genesis block for this rollup
+ * @param rollupCompatibilityID Compatibility ID for the added rollup
+ */
+ function addExistingRollup(
+ IPolygonRollupBase rollupAddress,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ bytes32 genesis,
+ uint8 rollupCompatibilityID
+ ) external onlyRole(_ADD_EXISTING_ROLLUP_ROLE) {
+ // Check chainID nullifier
+ if (chainIDToRollupID[chainID] != 0) {
+ revert ChainIDAlreadyExist();
+ }
+
+ // check chainID max value
+ // Currently we have this limitation by the circuit, might be removed in a future
+ if (chainID > type(uint32).max) {
+ revert ChainIDOutOfRange();
+ }
+ // Check if rollup address was already added
+ if (rollupAddressToID[address(rollupAddress)] != 0) {
+ revert RollupAddressAlreadyExist();
+ }
+
+ RollupData storage rollup = _addExistingRollup(
+ rollupAddress,
+ verifier,
+ forkID,
+ chainID,
+ rollupCompatibilityID
+ );
+ rollup.batchNumToStateRoot[0] = genesis;
+ }
+
+ /**
+ * @notice Add an already deployed rollup
+ * note that this rollup does not follow any rollupType
+ * @param rollupAddress Rollup address
+ * @param verifier Verifier address, must be added before
+ * @param forkID Fork id of the added rollup
+ * @param chainID Chain id of the added rollup
+ * @param rollupCompatibilityID Compatibility ID for the added rollup
+ */
+ function _addExistingRollup(
+ IPolygonRollupBase rollupAddress,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ uint8 rollupCompatibilityID
+ ) internal returns (RollupData storage rollup) {
+ uint32 rollupID = ++rollupCount;
+
+ // Set chainID nullifier
+ chainIDToRollupID[chainID] = rollupID;
+
+ // Store rollup data
+ rollupAddressToID[address(rollupAddress)] = rollupID;
+
+ rollup = rollupIDToRollupData[rollupID];
+ rollup.rollupContract = rollupAddress;
+ rollup.forkID = forkID;
+ rollup.verifier = verifier;
+ rollup.chainID = chainID;
+ rollup.rollupCompatibilityID = rollupCompatibilityID;
+ // rollup type is 0, since it does not follow any rollup type
+
+ emit AddExistingRollup(
+ rollupID,
+ forkID,
+ address(rollupAddress),
+ chainID,
+ rollupCompatibilityID,
+ 0
+ );
+ }
+
+ /**
+ * @notice Upgrade an existing rollup from the rollup admin address
+ * This address is able to udpate the rollup with more restrictions that the _UPDATE_ROLLUP_ROLE
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ */
+ function updateRollupByRollupAdmin(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID
+ ) external {
+ // Check admin of the network is msg.sender
+ if (IPolygonRollupBase(address(rollupContract)).admin() != msg.sender) {
+ revert OnlyRollupAdmin();
+ }
+
+ // Check all sequences are verified before upgrading
+ RollupData storage rollup = rollupIDToRollupData[
+ rollupAddressToID[address(rollupContract)]
+ ];
+
+ // Check all sequenced batches are verified
+ if (rollup.lastBatchSequenced != rollup.lastVerifiedBatch) {
+ revert AllSequencedMustBeVerified();
+ }
+
+ // review sanity check
+ if (rollup.rollupTypeID >= newRollupTypeID) {
+ revert UpdateToOldRollupTypeID();
+ }
+
+ _updateRollup(rollupContract, newRollupTypeID, new bytes(0));
+ }
+
+ /**
+ * @notice Upgrade an existing rollup
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ * @param upgradeData Upgrade data
+ */
+ function updateRollup(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes memory upgradeData
+ ) external onlyRole(_UPDATE_ROLLUP_ROLE) {
+ _updateRollup(rollupContract, newRollupTypeID, upgradeData);
+ }
+
+ /**
+ * @notice Upgrade an existing rollup
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ * @param upgradeData Upgrade data
+ */
+ function _updateRollup(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes memory upgradeData
+ ) internal {
+ // Check that rollup type exists
+ if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check the rollup exists
+ uint32 rollupID = rollupAddressToID[address(rollupContract)];
+ if (rollupID == 0) {
+ revert RollupMustExist();
+ }
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // The update must be to a new rollup type
+ if (rollup.rollupTypeID == newRollupTypeID) {
+ revert UpdateToSameRollupTypeID();
+ }
+
+ RollupType storage newRollupType = rollupTypeMap[newRollupTypeID];
+
+ // Check rollup type is not obsolete
+ if (newRollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ // Check compatibility of the rollups
+ if (
+ rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID
+ ) {
+ revert UpdateNotCompatible();
+ }
+
+ // Update rollup parameters
+ rollup.verifier = newRollupType.verifier;
+ rollup.forkID = newRollupType.forkID;
+ rollup.rollupTypeID = newRollupTypeID;
+
+ // review fix to vulnerability front running attack
+ if (rollup.lastPendingState != rollup.lastPendingStateConsolidated) {
+ revert CannotUpdateWithUnconsolidatedPendingState();
+ }
+
+ uint64 lastVerifiedBatch = getLastVerifiedBatch(rollupID);
+ rollup.lastVerifiedBatchBeforeUpgrade = lastVerifiedBatch;
+
+ // Upgrade rollup
+ rollupContract.upgradeToAndCall(
+ newRollupType.consensusImplementation,
+ upgradeData
+ );
+
+ emit UpdateRollup(rollupID, newRollupTypeID, lastVerifiedBatch);
+ }
+
+ /**
+ * @notice Rollback batches of the target rollup
+ * @param rollupContract Rollup consensus proxy address
+ * @param targetBatch Batch to rollback up to but not including this batch
+ */
+ function rollbackBatches(
+ IPolygonRollupBase rollupContract,
+ uint64 targetBatch
+ ) external {
+ // Check msg.sender has _UPDATE_ROLLUP_ROLE rol or is the admin of the network
+ if (
+ !hasRole(_UPDATE_ROLLUP_ROLE, msg.sender) &&
+ IPolygonRollupBase(address(rollupContract)).admin() != msg.sender
+ ) {
+ revert NotAllowedAddress();
+ }
+
+ // Check the rollup exists
+ uint32 rollupID = rollupAddressToID[address(rollupContract)];
+ if (rollupID == 0) {
+ revert RollupMustExist();
+ }
+
+ // Load rollup
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+ uint64 lastBatchSequenced = rollup.lastBatchSequenced;
+
+ // Batch to rollback should be already sequenced
+ if (
+ targetBatch >= lastBatchSequenced ||
+ targetBatch < rollup.lastVerifiedBatch
+ ) {
+ revert RollbackBatchIsNotValid();
+ }
+
+ uint64 currentBatch = lastBatchSequenced;
+
+ // delete sequence batches structs until the targetBatch
+ while (currentBatch != targetBatch) {
+ // Load previous end of sequence batch
+ uint64 previousBatch = rollup
+ .sequencedBatches[currentBatch]
+ .previousLastBatchSequenced;
+
+ // Batch to rollback must be end of a sequence
+ if (previousBatch < targetBatch) {
+ revert RollbackBatchIsNotEndOfSequence();
+ }
+
+ // delete sequence information
+ delete rollup.sequencedBatches[currentBatch];
+
+ // Update current batch for next iteration
+ currentBatch = previousBatch;
+ }
+
+ // Update last batch sequenced on rollup data
+ rollup.lastBatchSequenced = targetBatch;
+
+ // Update totalSequencedBatches
+ totalSequencedBatches -= lastBatchSequenced - targetBatch;
+
+ // Check pending state
+ if (rollup.lastPendingState > 0) {
+ // update total verified batches
+ uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
+ totalVerifiedBatches -=
+ currentLastVerifiedBatch -
+ rollup.lastVerifiedBatch;
+
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Clean pending state if any
+ rollupContract.rollbackBatches(
+ targetBatch,
+ rollup.sequencedBatches[targetBatch].accInputHash
+ );
+
+ emit RollbackBatches(
+ rollupID,
+ targetBatch,
+ rollup.sequencedBatches[targetBatch].accInputHash
+ );
+ }
+
+ /////////////////////////////////////
+ // Sequence/Verify batches functions
+ ////////////////////////////////////
+
+ /**
+ * @notice Sequence batches, callback called by one of the consensus managed by this contract
+ * @param newSequencedBatches Number of batches sequenced
+ * @param newAccInputHash New accumulate input hash
+ */
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external ifNotEmergencyState returns (uint64) {
+ // Check that the msg.sender is an added rollup
+ uint32 rollupID = rollupAddressToID[msg.sender];
+ if (rollupID == 0) {
+ revert SenderMustBeRollup();
+ }
+
+ // This prevents overwritting sequencedBatches
+ if (newSequencedBatches == 0) {
+ revert MustSequenceSomeBatch();
+ }
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // Update total sequence parameters
+ totalSequencedBatches += newSequencedBatches;
+
+ // Update sequenced batches of the current rollup
+ uint64 previousLastBatchSequenced = rollup.lastBatchSequenced;
+ uint64 newLastBatchSequenced = previousLastBatchSequenced +
+ newSequencedBatches;
+
+ rollup.lastBatchSequenced = newLastBatchSequenced;
+ rollup.sequencedBatches[newLastBatchSequenced] = SequencedBatchData({
+ accInputHash: newAccInputHash,
+ sequencedTimestamp: uint64(block.timestamp),
+ previousLastBatchSequenced: previousLastBatchSequenced
+ });
+
+ // Consolidate pending state if possible
+ _tryConsolidatePendingState(rollup);
+
+ emit OnSequenceBatches(rollupID, newLastBatchSequenced);
+
+ return newLastBatchSequenced;
+ }
+
+ /**
+ * @notice Allows an aggregator to verify multiple batches
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function verifyBatches(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) external ifNotEmergencyState {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // Check if the trusted aggregator timeout expired,
+ // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0
+ if (
+ rollup.sequencedBatches[finalNewBatch].sequencedTimestamp +
+ trustedAggregatorTimeout >
+ block.timestamp
+ ) {
+ revert TrustedAggregatorTimeoutNotExpired();
+ }
+
+ if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) {
+ revert ExceedMaxVerifyBatches();
+ }
+
+ _verifyAndRewardBatches(
+ rollup,
+ pendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary,
+ proof
+ );
+
+ // Update batch fees
+ _updateBatchFee(rollup, finalNewBatch);
+
+ if (pendingStateTimeout == 0) {
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+ } else {
+ // Consolidate pending state if possible
+ _tryConsolidatePendingState(rollup);
+
+ // Update pending state
+ rollup.lastPendingState++;
+ rollup.pendingStateTransitions[
+ rollup.lastPendingState
+ ] = PendingState({
+ timestamp: uint64(block.timestamp),
+ lastVerifiedBatch: finalNewBatch,
+ exitRoot: newLocalExitRoot,
+ stateRoot: newStateRoot
+ });
+ }
+
+ emit VerifyBatches(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Allows a trusted aggregator to verify multiple batches
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function verifyBatchesTrustedAggregator(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _verifyAndRewardBatches(
+ rollup,
+ pendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary,
+ proof
+ );
+
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ emit VerifyBatchesTrustedAggregator(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Verify and reward batches internal function
+ * @param rollup Rollup Data storage pointer that will be used to the verification
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function _verifyAndRewardBatches(
+ RollupData storage rollup,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) internal virtual {
+ bytes32 oldStateRoot;
+ uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
+
+ if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
+ revert InitBatchMustMatchCurrentForkID();
+ }
+
+ // Use pending state if specified, otherwise use consolidated state
+ if (pendingStateNum != 0) {
+ // Check that pending state exist
+ // Already consolidated pending states can be used aswell
+ if (pendingStateNum > rollup.lastPendingState) {
+ revert PendingStateDoesNotExist();
+ }
+
+ // Check choosen pending state
+ PendingState storage currentPendingState = rollup
+ .pendingStateTransitions[pendingStateNum];
+
+ // Get oldStateRoot from pending batch
+ oldStateRoot = currentPendingState.stateRoot;
+
+ // Check initNumBatch matches the pending state
+ if (initNumBatch != currentPendingState.lastVerifiedBatch) {
+ revert InitNumBatchDoesNotMatchPendingState();
+ }
+ } else {
+ // Use consolidated state
+ oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
+
+ if (oldStateRoot == bytes32(0)) {
+ revert OldStateRootDoesNotExist();
+ }
+
+ // Check initNumBatch is inside the range, sanity check
+ if (initNumBatch > currentLastVerifiedBatch) {
+ revert InitNumBatchAboveLastVerifiedBatch();
+ }
+ }
+
+ // Check final batch
+ if (finalNewBatch <= currentLastVerifiedBatch) {
+ revert FinalNumBatchBelowLastVerifiedBatch();
+ }
+
+ // Get snark bytes
+ bytes memory snarkHashBytes = _getInputSnarkBytes(
+ rollup,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+
+ // Calulate the snark input
+ uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
+
+ // Verify proof
+ if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
+ revert InvalidProof();
+ }
+
+ // Pay POL rewards
+ uint64 newVerifiedBatches = finalNewBatch - currentLastVerifiedBatch;
+
+ pol.safeTransfer(
+ beneficiary,
+ calculateRewardPerBatch() * newVerifiedBatches
+ );
+
+ // Update aggregation parameters
+ totalVerifiedBatches += newVerifiedBatches;
+ lastAggregationTimestamp = uint64(block.timestamp);
+
+ // Callback to the rollup address
+ rollup.rollupContract.onVerifyBatches(
+ finalNewBatch,
+ newStateRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Internal function to consolidate the state automatically once sequence or verify batches are called
+ * It tries to consolidate the first and the middle pending state in the queue
+ */
+ function _tryConsolidatePendingState(RollupData storage rollup) internal {
+ // Check if there's any state to consolidate
+ if (rollup.lastPendingState > rollup.lastPendingStateConsolidated) {
+ // Check if it's possible to consolidate the next pending state
+ uint64 nextPendingState = rollup.lastPendingStateConsolidated + 1;
+ if (_isPendingStateConsolidable(rollup, nextPendingState)) {
+ // Check middle pending state ( binary search of 1 step)
+ uint64 middlePendingState = nextPendingState +
+ (rollup.lastPendingState - nextPendingState) /
+ 2;
+
+ // Try to consolidate it, and if not, consolidate the nextPendingState
+ if (_isPendingStateConsolidable(rollup, middlePendingState)) {
+ _consolidatePendingState(rollup, middlePendingState);
+ } else {
+ _consolidatePendingState(rollup, nextPendingState);
+ }
+ }
+ }
+ }
+
+ /**
+ * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout
+ * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Pending state to consolidate
+ */
+ function consolidatePendingState(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) external {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+ // Check if pending state can be consolidated
+ // If trusted aggregator is the sender, do not check the timeout or the emergency state
+ if (!hasRole(_TRUSTED_AGGREGATOR_ROLE, msg.sender)) {
+ if (isEmergencyState) {
+ revert OnlyNotEmergencyState();
+ }
+
+ if (!_isPendingStateConsolidable(rollup, pendingStateNum)) {
+ revert PendingStateNotConsolidable();
+ }
+ }
+ _consolidatePendingState(rollup, pendingStateNum);
+ }
+
+ /**
+ * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
+ * @param rollup Rollup data storage pointer
+ * @param pendingStateNum Pending state to consolidate
+ */
+ function _consolidatePendingState(
+ RollupData storage rollup,
+ uint64 pendingStateNum
+ ) internal {
+ // Check if pendingStateNum is in correct range
+ // - not consolidated (implicity checks that is not 0)
+ // - exist ( has been added)
+ if (
+ pendingStateNum <= rollup.lastPendingStateConsolidated ||
+ pendingStateNum > rollup.lastPendingState
+ ) {
+ revert PendingStateInvalid();
+ }
+
+ PendingState storage currentPendingState = rollup
+ .pendingStateTransitions[pendingStateNum];
+
+ // Update state
+ uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch;
+ rollup.lastVerifiedBatch = newLastVerifiedBatch;
+ rollup.batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState
+ .stateRoot;
+ rollup.lastLocalExitRoot = currentPendingState.exitRoot;
+
+ // Update pending state
+ rollup.lastPendingStateConsolidated = pendingStateNum;
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ emit ConsolidatePendingState(
+ rollupAddressToID[address(rollup.rollupContract)],
+ newLastVerifiedBatch,
+ currentPendingState.stateRoot,
+ currentPendingState.exitRoot,
+ pendingStateNum
+ );
+ }
+
+ /////////////////////////////////
+ // Soundness protection functions
+ /////////////////////////////////
+
+ /**
+ * @notice Allows the trusted aggregator to override the pending state
+ * if it's possible to prove a different state root given the same batches
+ * @param rollupID Rollup identifier
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function overridePendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _proveDistinctPendingState(
+ rollup,
+ initPendingStateNum,
+ finalPendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ proof
+ );
+
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ // Update trusted aggregator timeout to max
+ trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT;
+
+ emit OverridePendingState(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Allows activate the emergency state if its possible to prove a different state root given the same batches
+ * @param rollupID Rollup identifier
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function proveNonDeterministicPendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) external ifNotEmergencyState {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _proveDistinctPendingState(
+ rollup,
+ initPendingStateNum,
+ finalPendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ proof
+ );
+
+ emit ProveNonDeterministicPendingState(
+ rollup.pendingStateTransitions[finalPendingStateNum].stateRoot,
+ newStateRoot
+ );
+
+ // Activate emergency state
+ _activateEmergencyState();
+ }
+
+ /**
+ * @notice Internal function that proves a different state root given the same batches to verify
+ * @param rollup Rollup Data struct that will be checked
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function _proveDistinctPendingState(
+ RollupData storage rollup,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) internal view virtual {
+ bytes32 oldStateRoot;
+
+ if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
+ revert InitBatchMustMatchCurrentForkID();
+ }
+
+ // Use pending state if specified, otherwise use consolidated state
+ if (initPendingStateNum != 0) {
+ // Check that pending state exist
+ // Already consolidated pending states can be used aswell
+ if (initPendingStateNum > rollup.lastPendingState) {
+ revert PendingStateDoesNotExist();
+ }
+
+ // Check choosen pending state
+ PendingState storage initPendingState = rollup
+ .pendingStateTransitions[initPendingStateNum];
+
+ // Get oldStateRoot from init pending state
+ oldStateRoot = initPendingState.stateRoot;
+
+ // Check initNumBatch matches the init pending state
+ if (initNumBatch != initPendingState.lastVerifiedBatch) {
+ revert InitNumBatchDoesNotMatchPendingState();
+ }
+ } else {
+ // Use consolidated state
+ oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
+ if (oldStateRoot == bytes32(0)) {
+ revert OldStateRootDoesNotExist();
+ }
+
+ // Check initNumBatch is inside the range, sanity check
+ if (initNumBatch > rollup.lastVerifiedBatch) {
+ revert InitNumBatchAboveLastVerifiedBatch();
+ }
+ }
+
+ // Assert final pending state num is in correct range
+ // - exist ( has been added)
+ // - bigger than the initPendingstate
+ // - not consolidated
+ if (
+ finalPendingStateNum > rollup.lastPendingState ||
+ finalPendingStateNum <= initPendingStateNum ||
+ finalPendingStateNum <= rollup.lastPendingStateConsolidated
+ ) {
+ revert FinalPendingStateNumInvalid();
+ }
+
+ // Check final num batch
+ if (
+ finalNewBatch !=
+ rollup
+ .pendingStateTransitions[finalPendingStateNum]
+ .lastVerifiedBatch
+ ) {
+ revert FinalNumBatchDoesNotMatchPendingState();
+ }
+
+ // Get snark bytes
+ bytes memory snarkHashBytes = _getInputSnarkBytes(
+ rollup,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+
+ // Calulate the snark input
+ uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
+
+ // Verify proof
+ if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
+ revert InvalidProof();
+ }
+
+ if (
+ rollup.pendingStateTransitions[finalPendingStateNum].stateRoot ==
+ newStateRoot
+ ) {
+ revert StoredRootMustBeDifferentThanNewRoot();
+ }
+ }
+
+ /**
+ * @notice Function to update the batch fee based on the new verified batches
+ * The batch fee will not be updated when the trusted aggregator verifies batches
+ * @param newLastVerifiedBatch New last verified batch
+ */
+ function _updateBatchFee(
+ RollupData storage rollup,
+ uint64 newLastVerifiedBatch
+ ) internal {
+ uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
+ uint64 currentBatch = newLastVerifiedBatch;
+
+ uint256 totalBatchesAboveTarget;
+ uint256 newBatchesVerified = newLastVerifiedBatch -
+ currentLastVerifiedBatch;
+
+ uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget;
+
+ while (currentBatch != currentLastVerifiedBatch) {
+ // Load sequenced batchdata
+ SequencedBatchData storage currentSequencedBatchData = rollup
+ .sequencedBatches[currentBatch];
+
+ // Check if timestamp is below the verifyBatchTimeTarget
+ if (
+ targetTimestamp < currentSequencedBatchData.sequencedTimestamp
+ ) {
+ // update currentBatch
+ currentBatch = currentSequencedBatchData
+ .previousLastBatchSequenced;
+ } else {
+ // The rest of batches will be above
+ totalBatchesAboveTarget =
+ currentBatch -
+ currentLastVerifiedBatch;
+ break;
+ }
+ }
+
+ uint256 totalBatchesBelowTarget = newBatchesVerified -
+ totalBatchesAboveTarget;
+
+ // _MAX_BATCH_FEE --> (< 70 bits)
+ // multiplierBatchFee --> (< 10 bits)
+ // _MAX_BATCH_MULTIPLIER = 12
+ // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits)
+ // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)-->
+ // (< 70 bits) * (< 128 bits) = < 256 bits
+
+ // Since all the following operations cannot overflow, we can optimize this operations with unchecked
+ unchecked {
+ if (totalBatchesBelowTarget < totalBatchesAboveTarget) {
+ // There are more batches above target, fee is multiplied
+ uint256 diffBatches = totalBatchesAboveTarget -
+ totalBatchesBelowTarget;
+
+ diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
+ ? _MAX_BATCH_MULTIPLIER
+ : diffBatches;
+
+ // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
+ _batchFee =
+ (_batchFee * (uint256(multiplierBatchFee) ** diffBatches)) /
+ (uint256(1000) ** diffBatches);
+ } else {
+ // There are more batches below target, fee is divided
+ uint256 diffBatches = totalBatchesBelowTarget -
+ totalBatchesAboveTarget;
+
+ diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
+ ? _MAX_BATCH_MULTIPLIER
+ : diffBatches;
+
+ // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
+ uint256 accDivisor = (uint256(1 ether) *
+ (uint256(multiplierBatchFee) ** diffBatches)) /
+ (uint256(1000) ** diffBatches);
+
+ // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3)
+ // accDivisor = 1E18 * multiplyFactor
+ // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor
+ // < 60 bits * < 70 bits / ~60 bits --> overflow not possible
+ _batchFee = (uint256(1 ether) * _batchFee) / accDivisor;
+ }
+ }
+
+ // Batch fee must remain inside a range
+ if (_batchFee > _MAX_BATCH_FEE) {
+ _batchFee = _MAX_BATCH_FEE;
+ } else if (_batchFee < _MIN_BATCH_FEE) {
+ _batchFee = _MIN_BATCH_FEE;
+ }
+ }
+
+ ////////////////////////
+ // Emergency state functions
+ ////////////////////////
+
+ /**
+ * @notice Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ * If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period
+ */
+ function activateEmergencyState() external {
+ if (!hasRole(_EMERGENCY_COUNCIL_ROLE, msg.sender)) {
+ if (
+ lastAggregationTimestamp == 0 ||
+ lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT >
+ block.timestamp ||
+ lastDeactivatedEmergencyStateTimestamp +
+ _HALT_AGGREGATION_TIMEOUT >
+ block.timestamp
+ ) {
+ revert HaltTimeoutNotExpired();
+ }
+ }
+ _activateEmergencyState();
+ }
+
+ /**
+ * @notice Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ */
+ function deactivateEmergencyState()
+ external
+ onlyRole(_STOP_EMERGENCY_ROLE)
+ {
+ // Set last deactivated emergency state
+ lastDeactivatedEmergencyStateTimestamp = uint64(block.timestamp);
+
+ // Deactivate emergency state on PolygonZkEVMBridge
+ bridgeAddress.deactivateEmergencyState();
+
+ // Deactivate emergency state on this contract
+ super._deactivateEmergencyState();
+ }
+
+ /**
+ * @notice Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ */
+ function _activateEmergencyState() internal override {
+ // Activate emergency state on PolygonZkEVM Bridge
+ bridgeAddress.activateEmergencyState();
+
+ // Activate emergency state on this contract
+ super._activateEmergencyState();
+ }
+
+ //////////////////
+ // Setter functions
+ //////////////////
+
+ /**
+ * @notice Set a new pending state timeout
+ * The timeout can only be lowered, except if emergency state is active
+ * @param newTrustedAggregatorTimeout Trusted aggregator timeout
+ */
+ function setTrustedAggregatorTimeout(
+ uint64 newTrustedAggregatorTimeout
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (!isEmergencyState) {
+ if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) {
+ revert NewTrustedAggregatorTimeoutMustBeLower();
+ }
+ }
+
+ trustedAggregatorTimeout = newTrustedAggregatorTimeout;
+ emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout);
+ }
+
+ /**
+ * @notice Set a new trusted aggregator timeout
+ * The timeout can only be lowered, except if emergency state is active
+ * @param newPendingStateTimeout Trusted aggregator timeout
+ */
+ function setPendingStateTimeout(
+ uint64 newPendingStateTimeout
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (!isEmergencyState) {
+ if (newPendingStateTimeout >= pendingStateTimeout) {
+ revert NewPendingStateTimeoutMustBeLower();
+ }
+ }
+
+ pendingStateTimeout = newPendingStateTimeout;
+ emit SetPendingStateTimeout(newPendingStateTimeout);
+ }
+
+ /**
+ * @notice Set a new multiplier batch fee
+ * @param newMultiplierBatchFee multiplier batch fee
+ */
+ function setMultiplierBatchFee(
+ uint16 newMultiplierBatchFee
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) {
+ revert InvalidRangeMultiplierBatchFee();
+ }
+
+ multiplierBatchFee = newMultiplierBatchFee;
+ emit SetMultiplierBatchFee(newMultiplierBatchFee);
+ }
+
+ /**
+ * @notice Set a new verify batch time target
+ * This value will only be relevant once the aggregation is decentralized, so
+ * the trustedAggregatorTimeout should be zero or very close to zero
+ * @param newVerifyBatchTimeTarget Verify batch time target
+ */
+ function setVerifyBatchTimeTarget(
+ uint64 newVerifyBatchTimeTarget
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (newVerifyBatchTimeTarget > 1 days) {
+ revert InvalidRangeBatchTimeTarget();
+ }
+ verifyBatchTimeTarget = newVerifyBatchTimeTarget;
+ emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget);
+ }
+
+ /**
+ * @notice Set the current batch fee
+ * @param newBatchFee new batch fee
+ */
+ function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) {
+ // check fees min and max
+ if (newBatchFee > _MAX_BATCH_FEE || newBatchFee < _MIN_BATCH_FEE) {
+ revert BatchFeeOutOfRange();
+ }
+ _batchFee = newBatchFee;
+ emit SetBatchFee(newBatchFee);
+ }
+
+ ////////////////////////
+ // view/pure functions
+ ///////////////////////
+
+ /**
+ * @notice Get the current rollup exit root
+ * Compute using all the local exit roots of all rollups the rollup exit root
+ * Since it's expected to have no more than 10 rollups in this first version, even if this approach
+ * has a gas consumption that scales linearly with the rollups added, it's ok
+ * In a future versions this computation will be done inside the circuit
+ */
+ function getRollupExitRoot() public view returns (bytes32) {
+ uint256 currentNodes = rollupCount;
+
+ // If there are no nodes return 0
+ if (currentNodes == 0) {
+ return bytes32(0);
+ }
+
+ // This array will contain the nodes of the current iteration
+ bytes32[] memory tmpTree = new bytes32[](currentNodes);
+
+ // In the first iteration the nodes will be the leafs which are the local exit roots of each network
+ for (uint256 i = 0; i < currentNodes; i++) {
+ // The first rollup ID starts on 1
+ tmpTree[i] = rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot;
+ }
+
+ // This variable will keep track of the zero hashes
+ bytes32 currentZeroHashHeight = 0;
+
+ // This variable will keep track of the reamining levels to compute
+ uint256 remainingLevels = _EXIT_TREE_DEPTH;
+
+ // Calculate the root of the sub-tree that contains all the localExitRoots
+ while (currentNodes != 1) {
+ uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2);
+ bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes);
+ for (uint256 i = 0; i < nextIterationNodes; i++) {
+ // if we are on the last iteration of the current level and the nodes are odd
+ if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) {
+ nextTmpTree[i] = keccak256(
+ abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight)
+ );
+ } else {
+ nextTmpTree[i] = keccak256(
+ abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1])
+ );
+ }
+ }
+
+ // Update tree variables
+ tmpTree = nextTmpTree;
+ currentNodes = nextIterationNodes;
+ currentZeroHashHeight = keccak256(
+ abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight)
+ );
+ remainingLevels--;
+ }
+
+ bytes32 currentRoot = tmpTree[0];
+
+ // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes
+ for (uint256 i = 0; i < remainingLevels; i++) {
+ currentRoot = keccak256(
+ abi.encodePacked(currentRoot, currentZeroHashHeight)
+ );
+ currentZeroHashHeight = keccak256(
+ abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight)
+ );
+ }
+ return currentRoot;
+ }
+
+ /**
+ * @notice Get the last verified batch
+ */
+ function getLastVerifiedBatch(
+ uint32 rollupID
+ ) public view returns (uint64) {
+ return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]);
+ }
+
+ /**
+ * @notice Get the last verified batch
+ */
+ function _getLastVerifiedBatch(
+ RollupData storage rollup
+ ) internal view returns (uint64) {
+ if (rollup.lastPendingState > 0) {
+ return
+ rollup
+ .pendingStateTransitions[rollup.lastPendingState]
+ .lastVerifiedBatch;
+ } else {
+ return rollup.lastVerifiedBatch;
+ }
+ }
+
+ /**
+ * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
+ * @param rollupID Rollup id
+ * @param pendingStateNum Pending state number to check
+ * Note that his function does not check if the pending state currently exists, or if it's consolidated already
+ */
+ function isPendingStateConsolidable(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) public view returns (bool) {
+ return
+ _isPendingStateConsolidable(
+ rollupIDToRollupData[rollupID],
+ pendingStateNum
+ );
+ }
+
+ /**
+ * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
+ * @param rollup Rollup data storage pointer
+ * @param pendingStateNum Pending state number to check
+ * Note that his function does not check if the pending state currently exists, or if it's consolidated already
+ */
+ function _isPendingStateConsolidable(
+ RollupData storage rollup,
+ uint64 pendingStateNum
+ ) internal view returns (bool) {
+ return (rollup.pendingStateTransitions[pendingStateNum].timestamp +
+ pendingStateTimeout <=
+ block.timestamp);
+ }
+
+ /**
+ * @notice Function to calculate the reward to verify a single batch
+ */
+ function calculateRewardPerBatch() public view returns (uint256) {
+ uint256 currentBalance = pol.balanceOf(address(this));
+
+ // Total Batches to be verified = total Sequenced Batches - total verified Batches
+ uint256 totalBatchesToVerify = totalSequencedBatches -
+ totalVerifiedBatches;
+
+ if (totalBatchesToVerify == 0) return 0;
+ return currentBalance / totalBatchesToVerify;
+ }
+
+ /**
+ * @notice Get batch fee
+ * This function is used instad of the automatic public view one,
+ * because in a future might change the behaviour and we will be able to mantain the interface
+ */
+ function getBatchFee() public view returns (uint256) {
+ return _batchFee;
+ }
+
+ /**
+ * @notice Get forced batch fee
+ */
+ function getForcedBatchFee() public view returns (uint256) {
+ return _batchFee * 100;
+ }
+
+ /**
+ * @notice Function to calculate the input snark bytes
+ * @param rollupID Rollup id used to calculate the input snark bytes
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param oldStateRoot State root before batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function getInputSnarkBytes(
+ uint32 rollupID,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) public view returns (bytes memory) {
+ return
+ _getInputSnarkBytes(
+ rollupIDToRollupData[rollupID],
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+ }
+
+ /**
+ * @notice Function to calculate the input snark bytes
+ * @param rollup Rollup data storage pointer
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param oldStateRoot State root before batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function _getInputSnarkBytes(
+ RollupData storage rollup,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) internal view returns (bytes memory) {
+ // Sanity check
+ bytes32 oldAccInputHash = rollup
+ .sequencedBatches[initNumBatch]
+ .accInputHash;
+
+ bytes32 newAccInputHash = rollup
+ .sequencedBatches[finalNewBatch]
+ .accInputHash;
+
+ // Sanity check
+ if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) {
+ revert OldAccInputHashDoesNotExist();
+ }
+
+ if (newAccInputHash == bytes32(0)) {
+ revert NewAccInputHashDoesNotExist();
+ }
+
+ // Check that new state root is inside goldilocks field
+ if (!_checkStateRootInsidePrime(uint256(newStateRoot))) {
+ revert NewStateRootNotInsidePrime();
+ }
+
+ return
+ abi.encodePacked(
+ msg.sender,
+ oldStateRoot,
+ oldAccInputHash,
+ initNumBatch,
+ rollup.chainID,
+ rollup.forkID,
+ newStateRoot,
+ newAccInputHash,
+ newLocalExitRoot,
+ finalNewBatch
+ );
+ }
+
+ /**
+ * @notice Function to check if the state root is inside of the prime field
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function _checkStateRootInsidePrime(
+ uint256 newStateRoot
+ ) internal pure returns (bool) {
+ if (
+ ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) &&
+ (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) &&
+ (((newStateRoot >> 128) & _MAX_UINT_64) <
+ _GOLDILOCKS_PRIME_FIELD) &&
+ ((newStateRoot >> 192) < _GOLDILOCKS_PRIME_FIELD)
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @notice Get rollup state root given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupBatchNumToStateRoot(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (bytes32) {
+ return rollupIDToRollupData[rollupID].batchNumToStateRoot[batchNum];
+ }
+
+ /**
+ * @notice Get rollup sequence batches struct given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupSequencedBatches(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (SequencedBatchData memory) {
+ return rollupIDToRollupData[rollupID].sequencedBatches[batchNum];
+ }
+
+ /**
+ * @notice Get rollup sequence pending state struct given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupPendingStateTransitions(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (PendingState memory) {
+ return rollupIDToRollupData[rollupID].pendingStateTransitions[batchNum];
+ }
+}
diff --git a/contracts/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.sol b/contracts/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.sol
new file mode 100644
index 000000000..8126e419a
--- /dev/null
+++ b/contracts/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.sol
@@ -0,0 +1,1911 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity 0.8.20;
+
+import "./IPolygonRollupManagerPrevious.sol";
+import "../interfaces/IPolygonZkEVMGlobalExitRootV2.sol";
+import "../../interfaces/IPolygonZkEVMBridge.sol";
+import "../interfaces/IPolygonRollupBase.sol";
+import "../../interfaces/IVerifierRollup.sol";
+import "../../lib/EmergencyManager.sol";
+import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
+import "../lib/PolygonTransparentProxy.sol";
+import "../lib/PolygonAccessControlUpgradeable.sol";
+import "../lib/LegacyZKEVMStateVariables.sol";
+import "../consensus/zkEVM/PolygonZkEVMExistentEtrog.sol";
+import "../lib/PolygonConstantsBase.sol";
+
+/**
+ * Contract responsible for managing rollups and the verification of their batches.
+ * This contract will create and update rollups and store all the hashed sequenced data from them.
+ * The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of
+ * them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future.
+ */
+contract PolygonRollupManagerPreviousV1toV2 is
+ PolygonAccessControlUpgradeable,
+ EmergencyManager,
+ LegacyZKEVMStateVariables,
+ PolygonConstantsBase,
+ IPolygonRollupManagerPrevious
+{
+ using SafeERC20Upgradeable for IERC20Upgradeable;
+
+ /**
+ * @notice Struct which to store the rollup type data
+ * @param consensusImplementation Consensus implementation ( contains the consensus logic for the transaparent proxy)
+ * @param verifier verifier
+ * @param forkID fork ID
+ * @param rollupCompatibilityID Rollup compatibility ID, to check upgradability between rollup types
+ * @param obsolete Indicates if the rollup type is obsolete
+ * @param genesis Genesis block of the rollup, note that will only be used on creating new rollups, not upgrade them
+ */
+ struct RollupType {
+ address consensusImplementation;
+ IVerifierRollup verifier;
+ uint64 forkID;
+ uint8 rollupCompatibilityID;
+ bool obsolete;
+ bytes32 genesis;
+ }
+
+ /**
+ * @notice Struct which to store the rollup data of each chain
+ * @param rollupContract Rollup consensus contract, which manages everything
+ * related to sequencing transactions
+ * @param chainID Chain ID of the rollup
+ * @param verifier Verifier contract
+ * @param forkID ForkID of the rollup
+ * @param batchNumToStateRoot State root mapping
+ * @param sequencedBatches Queue of batches that defines the virtual state
+ * @param pendingStateTransitions Pending state mapping
+ * @param lastLocalExitRoot Last exit root verified, used for compute the rollupExitRoot
+ * @param lastBatchSequenced Last batch sent by the consensus contract
+ * @param lastVerifiedBatch Last batch verified
+ * @param lastPendingState Last pending state
+ * @param lastPendingStateConsolidated Last pending state consolidated
+ * @param lastVerifiedBatchBeforeUpgrade Last batch verified before the last upgrade
+ * @param rollupTypeID Rollup type ID, can be 0 if it was added as an existing rollup
+ * @param rollupCompatibilityID Rollup ID used for compatibility checks when upgrading
+ */
+ struct RollupData {
+ IPolygonRollupBase rollupContract;
+ uint64 chainID;
+ IVerifierRollup verifier;
+ uint64 forkID;
+ mapping(uint64 batchNum => bytes32) batchNumToStateRoot;
+ mapping(uint64 batchNum => SequencedBatchData) sequencedBatches;
+ mapping(uint256 pendingStateNum => PendingState) pendingStateTransitions;
+ bytes32 lastLocalExitRoot;
+ uint64 lastBatchSequenced;
+ uint64 lastVerifiedBatch;
+ uint64 lastPendingState;
+ uint64 lastPendingStateConsolidated;
+ uint64 lastVerifiedBatchBeforeUpgrade;
+ uint64 rollupTypeID;
+ uint8 rollupCompatibilityID;
+ }
+
+ // Modulus zkSNARK
+ uint256 internal constant _RFIELD =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+
+ // Max batch multiplier per verification
+ uint256 internal constant _MAX_BATCH_MULTIPLIER = 12;
+
+ // Max batch fee value
+ uint256 internal constant _MAX_BATCH_FEE = 1000 ether;
+
+ // Min value batch fee
+ uint256 internal constant _MIN_BATCH_FEE = 1 gwei;
+
+ // Goldilocks prime field
+ uint256 internal constant _GOLDILOCKS_PRIME_FIELD = 0xFFFFFFFF00000001; // 2 ** 64 - 2 ** 32 + 1
+
+ // Max uint64
+ uint256 internal constant _MAX_UINT_64 = type(uint64).max; // 0xFFFFFFFFFFFFFFFF
+
+ // Exit merkle tree levels
+ uint256 internal constant _EXIT_TREE_DEPTH = 32;
+
+ // Roles
+
+ // Be able to add a new rollup type
+ bytes32 internal constant _ADD_ROLLUP_TYPE_ROLE =
+ keccak256("ADD_ROLLUP_TYPE_ROLE");
+
+ // Be able to obsolete a rollup type, which means that new rollups cannot use this type
+ bytes32 internal constant _OBSOLETE_ROLLUP_TYPE_ROLE =
+ keccak256("OBSOLETE_ROLLUP_TYPE_ROLE");
+
+ // Be able to create a new rollup using a rollup type
+ bytes32 internal constant _CREATE_ROLLUP_ROLE =
+ keccak256("CREATE_ROLLUP_ROLE");
+
+ // Be able to create a new rollup which does not have to follow any rollup type.
+ // Also sets the genesis block for that network
+ bytes32 internal constant _ADD_EXISTING_ROLLUP_ROLE =
+ keccak256("ADD_EXISTING_ROLLUP_ROLE");
+
+ // Be able to update a rollup to a new rollup type that it's compatible
+ bytes32 internal constant _UPDATE_ROLLUP_ROLE =
+ keccak256("UPDATE_ROLLUP_ROLE");
+
+ // Be able to that has priority to verify batches and consolidates the state instantly
+ bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE =
+ keccak256("TRUSTED_AGGREGATOR_ROLE");
+
+ // Be able to set the trusted aggregator address
+ bytes32 internal constant _TRUSTED_AGGREGATOR_ROLE_ADMIN =
+ keccak256("TRUSTED_AGGREGATOR_ROLE_ADMIN");
+
+ // Be able to tweak parameters
+ bytes32 internal constant _TWEAK_PARAMETERS_ROLE =
+ keccak256("TWEAK_PARAMETERS_ROLE");
+
+ // Be able to set the current batch fee
+ bytes32 internal constant _SET_FEE_ROLE = keccak256("SET_FEE_ROLE");
+
+ // Be able to stop the emergency state
+ bytes32 internal constant _STOP_EMERGENCY_ROLE =
+ keccak256("STOP_EMERGENCY_ROLE");
+
+ // Be able to activate the emergency state without any further condition
+ bytes32 internal constant _EMERGENCY_COUNCIL_ROLE =
+ keccak256("EMERGENCY_COUNCIL_ROLE");
+
+ // Be able to set the emergency council address
+ bytes32 internal constant _EMERGENCY_COUNCIL_ADMIN =
+ keccak256("EMERGENCY_COUNCIL_ADMIN");
+
+ // Global Exit Root address
+ IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager;
+
+ // PolygonZkEVM Bridge Address
+ IPolygonZkEVMBridge public immutable bridgeAddress;
+
+ // POL token address
+ IERC20Upgradeable public immutable pol;
+
+ // Number of rollup types added, every new type will be assigned sequencially a new ID
+ uint32 public rollupTypeCount;
+
+ // Rollup type mapping
+ mapping(uint32 rollupTypeID => RollupType) public rollupTypeMap;
+
+ // Number of rollups added, every new rollup will be assigned sequencially a new ID
+ uint32 public rollupCount;
+
+ // Rollups ID mapping
+ mapping(uint32 rollupID => RollupData) public rollupIDToRollupData;
+
+ // Rollups address mapping
+ mapping(address rollupAddress => uint32 rollupID) public rollupAddressToID;
+
+ // Chain ID mapping for nullifying
+ // note we will take care to avoid that current known chainIDs are not reused in our networks (example: 1)
+ mapping(uint64 chainID => uint32 rollupID) public chainIDToRollupID;
+
+ // Total sequenced batches across all rollups
+ uint64 public totalSequencedBatches;
+
+ // Total verified batches across all rollups
+ uint64 public totalVerifiedBatches;
+
+ // Last timestamp when an aggregation happen
+ uint64 public lastAggregationTimestamp;
+
+ // Trusted aggregator timeout, if a sequence is not verified in this time frame,
+ // everyone can verify that sequence
+ uint64 public trustedAggregatorTimeout;
+
+ // Once a pending state exceeds this timeout it can be consolidated
+ uint64 public pendingStateTimeout;
+
+ // Time target of the verification of a batch
+ // Adaptively the batchFee will be updated to achieve this target
+ uint64 public verifyBatchTimeTarget;
+
+ // Batch fee multiplier with 3 decimals that goes from 1000 - 1023
+ uint16 public multiplierBatchFee;
+
+ // Current POL fee per batch sequenced
+ // note This variable is internal, since the view function getBatchFee is likely to be upgraded
+ uint256 internal _batchFee;
+
+ // Timestamp when the last emergency state was deactivated
+ uint64 public lastDeactivatedEmergencyStateTimestamp;
+
+ /**
+ * @dev Emitted when a new rollup type is added
+ */
+ event AddNewRollupType(
+ uint32 indexed rollupTypeID,
+ address consensusImplementation,
+ address verifier,
+ uint64 forkID,
+ uint8 rollupCompatibilityID,
+ bytes32 genesis,
+ string description
+ );
+
+ /**
+ * @dev Emitted when a a rolup type is obsoleted
+ */
+ event ObsoleteRollupType(uint32 indexed rollupTypeID);
+
+ /**
+ * @dev Emitted when a new rollup is created based on a rollupType
+ */
+ event CreateNewRollup(
+ uint32 indexed rollupID,
+ uint32 rollupTypeID,
+ address rollupAddress,
+ uint64 chainID,
+ address gasTokenAddress
+ );
+
+ /**
+ * @dev Emitted when an existing rollup is added
+ */
+ event AddExistingRollup(
+ uint32 indexed rollupID,
+ uint64 forkID,
+ address rollupAddress,
+ uint64 chainID,
+ uint8 rollupCompatibilityID,
+ uint64 lastVerifiedBatchBeforeUpgrade
+ );
+
+ /**
+ * @dev Emitted when a rollup is udpated
+ */
+ event UpdateRollup(
+ uint32 indexed rollupID,
+ uint32 newRollupTypeID,
+ uint64 lastVerifiedBatchBeforeUpgrade
+ );
+
+ /**
+ * @dev Emitted when a new verifier is added
+ */
+ event OnSequenceBatches(uint32 indexed rollupID, uint64 lastBatchSequenced);
+
+ /**
+ * @dev Emitted when an aggregator verifies batches
+ */
+ event VerifyBatches(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address indexed aggregator
+ );
+
+ /**
+ * @dev Emitted when the trusted aggregator verifies batches
+ */
+ event VerifyBatchesTrustedAggregator(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address indexed aggregator
+ );
+
+ /**
+ * @dev Emitted when pending state is consolidated
+ */
+ event ConsolidatePendingState(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ uint64 pendingStateNum
+ );
+
+ /**
+ * @dev Emitted when is proved a different state given the same batches
+ */
+ event ProveNonDeterministicPendingState(
+ bytes32 storedStateRoot,
+ bytes32 provedStateRoot
+ );
+
+ /**
+ * @dev Emitted when the trusted aggregator overrides pending state
+ */
+ event OverridePendingState(
+ uint32 indexed rollupID,
+ uint64 numBatch,
+ bytes32 stateRoot,
+ bytes32 exitRoot,
+ address aggregator
+ );
+
+ /**
+ * @dev Emitted when is updated the trusted aggregator timeout
+ */
+ event SetTrustedAggregatorTimeout(uint64 newTrustedAggregatorTimeout);
+
+ /**
+ * @dev Emitted when is updated the pending state timeout
+ */
+ event SetPendingStateTimeout(uint64 newPendingStateTimeout);
+
+ /**
+ * @dev Emitted when is updated the multiplier batch fee
+ */
+ event SetMultiplierBatchFee(uint16 newMultiplierBatchFee);
+
+ /**
+ * @dev Emitted when is updated the verify batch timeout
+ */
+ event SetVerifyBatchTimeTarget(uint64 newVerifyBatchTimeTarget);
+
+ /**
+ * @dev Emitted when is updated the trusted aggregator address
+ */
+ event SetTrustedAggregator(address newTrustedAggregator);
+
+ /**
+ * @dev Emitted when is updated the batch fee
+ */
+ event SetBatchFee(uint256 newBatchFee);
+
+ /**
+ * @param _globalExitRootManager Global exit root manager address
+ * @param _pol POL token address
+ * @param _bridgeAddress Bridge address
+ */
+ constructor(
+ IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ IERC20Upgradeable _pol,
+ IPolygonZkEVMBridge _bridgeAddress
+ ) {
+ globalExitRootManager = _globalExitRootManager;
+ pol = _pol;
+ bridgeAddress = _bridgeAddress;
+
+ // Disable initalizers on the implementation following the best practices
+ _disableInitializers();
+ }
+
+ /**
+ * @param trustedAggregator Trusted aggregator address
+ * @param _pendingStateTimeout Pending state timeout
+ * @param _trustedAggregatorTimeout Trusted aggregator timeout
+ * @param admin Admin of the rollup manager
+ * @param timelock Timelock address
+ * @param emergencyCouncil Emergency council address
+ * @param polygonZkEVM New deployed Polygon zkEVM which will be initialized wiht previous values
+ * @param zkEVMVerifier Verifier of the new zkEVM deployed
+ * @param zkEVMForkID Fork id of the new zkEVM deployed
+ * @param zkEVMChainID Chain id of the new zkEVM deployed
+ */
+ function initialize(
+ address trustedAggregator,
+ uint64 _pendingStateTimeout,
+ uint64 _trustedAggregatorTimeout,
+ address admin,
+ address timelock,
+ address emergencyCouncil,
+ PolygonZkEVMExistentEtrog polygonZkEVM,
+ IVerifierRollup zkEVMVerifier,
+ uint64 zkEVMForkID,
+ uint64 zkEVMChainID
+ ) external virtual reinitializer(2) {
+ pendingStateTimeout = _pendingStateTimeout;
+ trustedAggregatorTimeout = _trustedAggregatorTimeout;
+
+ // Constant deployment variables
+ _batchFee = 0.1 ether; // 0.1 POL
+ verifyBatchTimeTarget = 30 minutes;
+ multiplierBatchFee = 1002;
+
+ // Initialize OZ contracts
+ __AccessControl_init();
+
+ // setup roles
+
+ // trusted aggregator role
+ _setupRole(_TRUSTED_AGGREGATOR_ROLE, trustedAggregator);
+
+ // Timelock roles
+ _setupRole(DEFAULT_ADMIN_ROLE, timelock);
+ _setupRole(_ADD_ROLLUP_TYPE_ROLE, timelock);
+ _setupRole(_ADD_EXISTING_ROLLUP_ROLE, timelock);
+
+ // note even this role can only update to an already added verifier/consensus
+ // Could break the compatibility of them, changing the virtual state
+ _setupRole(_UPDATE_ROLLUP_ROLE, timelock);
+
+ // admin roles
+ _setupRole(_OBSOLETE_ROLLUP_TYPE_ROLE, admin);
+ _setupRole(_CREATE_ROLLUP_ROLE, admin);
+ _setupRole(_STOP_EMERGENCY_ROLE, admin);
+ _setupRole(_TWEAK_PARAMETERS_ROLE, admin);
+
+ // admin should be able to update the trusted aggregator address
+ _setRoleAdmin(_TRUSTED_AGGREGATOR_ROLE, _TRUSTED_AGGREGATOR_ROLE_ADMIN);
+ _setupRole(_TRUSTED_AGGREGATOR_ROLE_ADMIN, admin);
+ _setupRole(_SET_FEE_ROLE, admin);
+
+ // Emergency council roles
+ _setRoleAdmin(_EMERGENCY_COUNCIL_ROLE, _EMERGENCY_COUNCIL_ADMIN);
+ _setupRole(_EMERGENCY_COUNCIL_ROLE, emergencyCouncil);
+ _setupRole(_EMERGENCY_COUNCIL_ADMIN, emergencyCouncil);
+
+ // Check last verified batch
+ uint64 zkEVMLastBatchSequenced = _legacylastBatchSequenced;
+ uint64 zkEVMLastVerifiedBatch = _legacyLastVerifiedBatch;
+ if (zkEVMLastBatchSequenced != zkEVMLastVerifiedBatch) {
+ revert AllzkEVMSequencedBatchesMustBeVerified();
+ }
+
+ // Initialize current zkEVM
+ RollupData storage currentZkEVM = _addExistingRollup(
+ IPolygonRollupBase(polygonZkEVM),
+ zkEVMVerifier,
+ zkEVMForkID,
+ zkEVMChainID,
+ 0, // Rollup compatibility ID is 0
+ _legacyLastVerifiedBatch
+ );
+
+ // Copy variables from legacy
+ currentZkEVM.batchNumToStateRoot[
+ zkEVMLastVerifiedBatch
+ ] = _legacyBatchNumToStateRoot[zkEVMLastVerifiedBatch];
+
+ // note previousLastBatchSequenced of the SequencedBatchData will be inconsistent,
+ // since there will not be a previous sequence stored in the sequence mapping.
+ // However since lastVerifiedBatch is equal to the lastBatchSequenced
+ // won't affect in any case
+ currentZkEVM.sequencedBatches[
+ zkEVMLastBatchSequenced
+ ] = _legacySequencedBatches[zkEVMLastBatchSequenced];
+
+ currentZkEVM.lastBatchSequenced = zkEVMLastBatchSequenced;
+ currentZkEVM.lastVerifiedBatch = zkEVMLastVerifiedBatch;
+ currentZkEVM.lastVerifiedBatchBeforeUpgrade = zkEVMLastVerifiedBatch;
+ // rollupType and rollupCompatibilityID will be both 0
+
+ // Initialize polygon zkevm
+ polygonZkEVM.initializeUpgrade(
+ _legacyAdmin,
+ _legacyTrustedSequencer,
+ _legacyTrustedSequencerURL,
+ _legacyNetworkName,
+ _legacySequencedBatches[zkEVMLastBatchSequenced].accInputHash
+ );
+ }
+
+ ///////////////////////////////////////
+ // Rollups management functions
+ ///////////////////////////////////////
+
+ /**
+ * @notice Add a new rollup type
+ * @param consensusImplementation Consensus implementation
+ * @param verifier Verifier address
+ * @param forkID ForkID of the verifier
+ * @param genesis Genesis block of the rollup
+ * @param description Description of the rollup type
+ */
+ function addNewRollupType(
+ address consensusImplementation,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint8 rollupCompatibilityID,
+ bytes32 genesis,
+ string memory description
+ ) external onlyRole(_ADD_ROLLUP_TYPE_ROLE) {
+ uint32 rollupTypeID = ++rollupTypeCount;
+
+ rollupTypeMap[rollupTypeID] = RollupType({
+ consensusImplementation: consensusImplementation,
+ verifier: verifier,
+ forkID: forkID,
+ rollupCompatibilityID: rollupCompatibilityID,
+ obsolete: false,
+ genesis: genesis
+ });
+
+ emit AddNewRollupType(
+ rollupTypeID,
+ consensusImplementation,
+ address(verifier),
+ forkID,
+ rollupCompatibilityID,
+ genesis,
+ description
+ );
+ }
+
+ /**
+ * @notice Obsolete Rollup type
+ * @param rollupTypeID Rollup type to obsolete
+ */
+ function obsoleteRollupType(
+ uint32 rollupTypeID
+ ) external onlyRole(_OBSOLETE_ROLLUP_TYPE_ROLE) {
+ // Check that rollup type exists
+ if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check rollup type is not obsolete
+ RollupType storage currentRollupType = rollupTypeMap[rollupTypeID];
+ if (currentRollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ currentRollupType.obsolete = true;
+
+ emit ObsoleteRollupType(rollupTypeID);
+ }
+
+ /**
+ * @notice Create a new rollup
+ * @param rollupTypeID Rollup type to deploy
+ * @param chainID ChainID of the rollup, must be a new one
+ * @param admin Admin of the new created rollup
+ * @param sequencer Sequencer of the new created rollup
+ * @param gasTokenAddress Indicates the token address that will be used to pay gas fees in the new rollup
+ * Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead
+ * @param sequencerURL Sequencer URL of the new created rollup
+ * @param networkName Network name of the new created rollup
+ */
+ function createNewRollup(
+ uint32 rollupTypeID,
+ uint64 chainID,
+ address admin,
+ address sequencer,
+ address gasTokenAddress,
+ string memory sequencerURL,
+ string memory networkName
+ ) external onlyRole(_CREATE_ROLLUP_ROLE) {
+ // Check that rollup type exists
+ if (rollupTypeID == 0 || rollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check rollup type is not obsolete
+ RollupType storage rollupType = rollupTypeMap[rollupTypeID];
+ if (rollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ // Check chainID nullifier
+ if (chainIDToRollupID[chainID] != 0) {
+ revert ChainIDAlreadyExist();
+ }
+
+ // Create a new Rollup, using a transparent proxy pattern
+ // Consensus will be the implementation, and this contract the admin
+ uint32 rollupID = ++rollupCount;
+ address rollupAddress = address(
+ new PolygonTransparentProxy(
+ rollupType.consensusImplementation,
+ address(this),
+ new bytes(0)
+ )
+ );
+
+ // Set chainID nullifier
+ chainIDToRollupID[chainID] = rollupID;
+
+ // Store rollup data
+ rollupAddressToID[rollupAddress] = rollupID;
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ rollup.rollupContract = IPolygonRollupBase(rollupAddress);
+ rollup.forkID = rollupType.forkID;
+ rollup.verifier = rollupType.verifier;
+ rollup.chainID = chainID;
+ rollup.batchNumToStateRoot[0] = rollupType.genesis;
+ rollup.rollupTypeID = rollupTypeID;
+ rollup.rollupCompatibilityID = rollupType.rollupCompatibilityID;
+
+ emit CreateNewRollup(
+ rollupID,
+ rollupTypeID,
+ rollupAddress,
+ chainID,
+ gasTokenAddress
+ );
+
+ // Initialize new rollup
+ IPolygonRollupBase(rollupAddress).initialize(
+ admin,
+ sequencer,
+ rollupID,
+ gasTokenAddress,
+ sequencerURL,
+ networkName
+ );
+ }
+
+ /**
+ * @notice Add an already deployed rollup
+ * note that this rollup does not follow any rollupType
+ * @param rollupAddress Rollup address
+ * @param verifier Verifier address, must be added before
+ * @param forkID Fork id of the added rollup
+ * @param chainID Chain id of the added rollup
+ * @param genesis Genesis block for this rollup
+ * @param rollupCompatibilityID Compatibility ID for the added rollup
+ */
+ function addExistingRollup(
+ IPolygonRollupBase rollupAddress,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ bytes32 genesis,
+ uint8 rollupCompatibilityID
+ ) external onlyRole(_ADD_EXISTING_ROLLUP_ROLE) {
+ // Check chainID nullifier
+ if (chainIDToRollupID[chainID] != 0) {
+ revert ChainIDAlreadyExist();
+ }
+
+ // Check if rollup address was already added
+ if (rollupAddressToID[address(rollupAddress)] != 0) {
+ revert RollupAddressAlreadyExist();
+ }
+
+ RollupData storage rollup = _addExistingRollup(
+ rollupAddress,
+ verifier,
+ forkID,
+ chainID,
+ rollupCompatibilityID,
+ 0 // last verified batch it's always 0
+ );
+ rollup.batchNumToStateRoot[0] = genesis;
+ }
+
+ /**
+ * @notice Add an already deployed rollup
+ * note that this rollup does not follow any rollupType
+ * @param rollupAddress Rollup address
+ * @param verifier Verifier address, must be added before
+ * @param forkID Fork id of the added rollup
+ * @param chainID Chain id of the added rollup
+ * @param rollupCompatibilityID Compatibility ID for the added rollup
+ * @param lastVerifiedBatch Last verified batch before adding the rollup
+ */
+ function _addExistingRollup(
+ IPolygonRollupBase rollupAddress,
+ IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ uint8 rollupCompatibilityID,
+ uint64 lastVerifiedBatch
+ ) internal returns (RollupData storage rollup) {
+ uint32 rollupID = ++rollupCount;
+
+ // Set chainID nullifier
+ chainIDToRollupID[chainID] = rollupID;
+
+ // Store rollup data
+ rollupAddressToID[address(rollupAddress)] = rollupID;
+
+ rollup = rollupIDToRollupData[rollupID];
+ rollup.rollupContract = rollupAddress;
+ rollup.forkID = forkID;
+ rollup.verifier = verifier;
+ rollup.chainID = chainID;
+ rollup.rollupCompatibilityID = rollupCompatibilityID;
+ // rollup type is 0, since it does not follow any rollup type
+
+ emit AddExistingRollup(
+ rollupID,
+ forkID,
+ address(rollupAddress),
+ chainID,
+ rollupCompatibilityID,
+ lastVerifiedBatch
+ );
+ }
+
+ /**
+ * @notice Upgrade an existing rollup
+ * @param rollupContract Rollup consensus proxy address
+ * @param newRollupTypeID New rolluptypeID to upgrade to
+ * @param upgradeData Upgrade data
+ */
+ function updateRollup(
+ ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes calldata upgradeData
+ ) external onlyRole(_UPDATE_ROLLUP_ROLE) {
+ // Check that rollup type exists
+ if (newRollupTypeID == 0 || newRollupTypeID > rollupTypeCount) {
+ revert RollupTypeDoesNotExist();
+ }
+
+ // Check the rollup exists
+ uint32 rollupID = rollupAddressToID[address(rollupContract)];
+ if (rollupID == 0) {
+ revert RollupMustExist();
+ }
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // The update must be to a new rollup type
+ if (rollup.rollupTypeID == newRollupTypeID) {
+ revert UpdateToSameRollupTypeID();
+ }
+
+ RollupType storage newRollupType = rollupTypeMap[newRollupTypeID];
+
+ // Check rollup type is not obsolete
+ if (newRollupType.obsolete == true) {
+ revert RollupTypeObsolete();
+ }
+
+ // Check compatibility of the rollups
+ if (
+ rollup.rollupCompatibilityID != newRollupType.rollupCompatibilityID
+ ) {
+ revert UpdateNotCompatible();
+ }
+
+ // Update rollup parameters
+ rollup.verifier = newRollupType.verifier;
+ rollup.forkID = newRollupType.forkID;
+ rollup.rollupTypeID = newRollupTypeID;
+
+ uint64 lastVerifiedBatch = getLastVerifiedBatch(rollupID);
+ rollup.lastVerifiedBatchBeforeUpgrade = lastVerifiedBatch;
+
+ // Upgrade rollup
+ rollupContract.upgradeToAndCall(
+ newRollupType.consensusImplementation,
+ upgradeData
+ );
+
+ emit UpdateRollup(rollupID, newRollupTypeID, lastVerifiedBatch);
+ }
+
+ /////////////////////////////////////
+ // Sequence/Verify batches functions
+ ////////////////////////////////////
+
+ /**
+ * @notice Sequence batches, callback called by one of the consensus managed by this contract
+ * @param newSequencedBatches Number of batches sequenced
+ * @param newAccInputHash New accumulate input hash
+ */
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external ifNotEmergencyState returns (uint64) {
+ // Check that the msg.sender is an added rollup
+ uint32 rollupID = rollupAddressToID[msg.sender];
+ if (rollupID == 0) {
+ revert SenderMustBeRollup();
+ }
+
+ // This prevents overwritting sequencedBatches
+ if (newSequencedBatches == 0) {
+ revert MustSequenceSomeBatch();
+ }
+
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // Update total sequence parameters
+ totalSequencedBatches += newSequencedBatches;
+
+ // Update sequenced batches of the current rollup
+ uint64 previousLastBatchSequenced = rollup.lastBatchSequenced;
+ uint64 newLastBatchSequenced = previousLastBatchSequenced +
+ newSequencedBatches;
+
+ rollup.lastBatchSequenced = newLastBatchSequenced;
+ rollup.sequencedBatches[newLastBatchSequenced] = SequencedBatchData({
+ accInputHash: newAccInputHash,
+ sequencedTimestamp: uint64(block.timestamp),
+ previousLastBatchSequenced: previousLastBatchSequenced
+ });
+
+ // Consolidate pending state if possible
+ _tryConsolidatePendingState(rollup);
+
+ emit OnSequenceBatches(rollupID, newLastBatchSequenced);
+
+ return newLastBatchSequenced;
+ }
+
+ /**
+ * @notice Allows an aggregator to verify multiple batches
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function verifyBatches(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) external ifNotEmergencyState {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ // Check if the trusted aggregator timeout expired,
+ // Note that the sequencedBatches struct must exists for this finalNewBatch, if not newAccInputHash will be 0
+ if (
+ rollup.sequencedBatches[finalNewBatch].sequencedTimestamp +
+ trustedAggregatorTimeout >
+ block.timestamp
+ ) {
+ revert TrustedAggregatorTimeoutNotExpired();
+ }
+
+ if (finalNewBatch - initNumBatch > _MAX_VERIFY_BATCHES) {
+ revert ExceedMaxVerifyBatches();
+ }
+
+ _verifyAndRewardBatches(
+ rollup,
+ pendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary,
+ proof
+ );
+
+ // Update batch fees
+ _updateBatchFee(rollup, finalNewBatch);
+
+ if (pendingStateTimeout == 0) {
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+ } else {
+ // Consolidate pending state if possible
+ _tryConsolidatePendingState(rollup);
+
+ // Update pending state
+ rollup.lastPendingState++;
+ rollup.pendingStateTransitions[
+ rollup.lastPendingState
+ ] = PendingState({
+ timestamp: uint64(block.timestamp),
+ lastVerifiedBatch: finalNewBatch,
+ exitRoot: newLocalExitRoot,
+ stateRoot: newStateRoot
+ });
+ }
+
+ emit VerifyBatches(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Allows a trusted aggregator to verify multiple batches
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function verifyBatchesTrustedAggregator(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _verifyAndRewardBatches(
+ rollup,
+ pendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary,
+ proof
+ );
+
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ emit VerifyBatchesTrustedAggregator(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Verify and reward batches internal function
+ * @param rollup Rollup Data storage pointer that will be used to the verification
+ * @param pendingStateNum Init pending state, 0 if consolidated state is used
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param beneficiary Address that will receive the verification reward
+ * @param proof Fflonk proof
+ */
+ function _verifyAndRewardBatches(
+ RollupData storage rollup,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] calldata proof
+ ) internal virtual {
+ bytes32 oldStateRoot;
+ uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
+
+ if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
+ revert InitBatchMustMatchCurrentForkID();
+ }
+
+ // Use pending state if specified, otherwise use consolidated state
+ if (pendingStateNum != 0) {
+ // Check that pending state exist
+ // Already consolidated pending states can be used aswell
+ if (pendingStateNum > rollup.lastPendingState) {
+ revert PendingStateDoesNotExist();
+ }
+
+ // Check choosen pending state
+ PendingState storage currentPendingState = rollup
+ .pendingStateTransitions[pendingStateNum];
+
+ // Get oldStateRoot from pending batch
+ oldStateRoot = currentPendingState.stateRoot;
+
+ // Check initNumBatch matches the pending state
+ if (initNumBatch != currentPendingState.lastVerifiedBatch) {
+ revert InitNumBatchDoesNotMatchPendingState();
+ }
+ } else {
+ // Use consolidated state
+ oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
+
+ if (oldStateRoot == bytes32(0)) {
+ revert OldStateRootDoesNotExist();
+ }
+
+ // Check initNumBatch is inside the range, sanity check
+ if (initNumBatch > currentLastVerifiedBatch) {
+ revert InitNumBatchAboveLastVerifiedBatch();
+ }
+ }
+
+ // Check final batch
+ if (finalNewBatch <= currentLastVerifiedBatch) {
+ revert FinalNumBatchBelowLastVerifiedBatch();
+ }
+
+ // Get snark bytes
+ bytes memory snarkHashBytes = _getInputSnarkBytes(
+ rollup,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+
+ // Calulate the snark input
+ uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
+
+ // Verify proof
+ if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
+ revert InvalidProof();
+ }
+
+ // Pay POL rewards
+ uint64 newVerifiedBatches = finalNewBatch - currentLastVerifiedBatch;
+
+ pol.safeTransfer(
+ beneficiary,
+ calculateRewardPerBatch() * newVerifiedBatches
+ );
+
+ // Update aggregation parameters
+ totalVerifiedBatches += newVerifiedBatches;
+ lastAggregationTimestamp = uint64(block.timestamp);
+
+ // Callback to the rollup address
+ rollup.rollupContract.onVerifyBatches(
+ finalNewBatch,
+ newStateRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Internal function to consolidate the state automatically once sequence or verify batches are called
+ * It tries to consolidate the first and the middle pending state in the queue
+ */
+ function _tryConsolidatePendingState(RollupData storage rollup) internal {
+ // Check if there's any state to consolidate
+ if (rollup.lastPendingState > rollup.lastPendingStateConsolidated) {
+ // Check if it's possible to consolidate the next pending state
+ uint64 nextPendingState = rollup.lastPendingStateConsolidated + 1;
+ if (_isPendingStateConsolidable(rollup, nextPendingState)) {
+ // Check middle pending state ( binary search of 1 step)
+ uint64 middlePendingState = nextPendingState +
+ (rollup.lastPendingState - nextPendingState) /
+ 2;
+
+ // Try to consolidate it, and if not, consolidate the nextPendingState
+ if (_isPendingStateConsolidable(rollup, middlePendingState)) {
+ _consolidatePendingState(rollup, middlePendingState);
+ } else {
+ _consolidatePendingState(rollup, nextPendingState);
+ }
+ }
+ }
+ }
+
+ /**
+ * @notice Allows to consolidate any pending state that has already exceed the pendingStateTimeout
+ * Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
+ * @param rollupID Rollup identifier
+ * @param pendingStateNum Pending state to consolidate
+ */
+ function consolidatePendingState(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) external {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+ // Check if pending state can be consolidated
+ // If trusted aggregator is the sender, do not check the timeout or the emergency state
+ if (!hasRole(_TRUSTED_AGGREGATOR_ROLE, msg.sender)) {
+ if (isEmergencyState) {
+ revert OnlyNotEmergencyState();
+ }
+
+ if (!_isPendingStateConsolidable(rollup, pendingStateNum)) {
+ revert PendingStateNotConsolidable();
+ }
+ }
+ _consolidatePendingState(rollup, pendingStateNum);
+ }
+
+ /**
+ * @notice Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
+ * @param rollup Rollup data storage pointer
+ * @param pendingStateNum Pending state to consolidate
+ */
+ function _consolidatePendingState(
+ RollupData storage rollup,
+ uint64 pendingStateNum
+ ) internal {
+ // Check if pendingStateNum is in correct range
+ // - not consolidated (implicity checks that is not 0)
+ // - exist ( has been added)
+ if (
+ pendingStateNum <= rollup.lastPendingStateConsolidated ||
+ pendingStateNum > rollup.lastPendingState
+ ) {
+ revert PendingStateInvalid();
+ }
+
+ PendingState storage currentPendingState = rollup
+ .pendingStateTransitions[pendingStateNum];
+
+ // Update state
+ uint64 newLastVerifiedBatch = currentPendingState.lastVerifiedBatch;
+ rollup.lastVerifiedBatch = newLastVerifiedBatch;
+ rollup.batchNumToStateRoot[newLastVerifiedBatch] = currentPendingState
+ .stateRoot;
+ rollup.lastLocalExitRoot = currentPendingState.exitRoot;
+
+ // Update pending state
+ rollup.lastPendingStateConsolidated = pendingStateNum;
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ emit ConsolidatePendingState(
+ rollupAddressToID[address(rollup.rollupContract)],
+ newLastVerifiedBatch,
+ currentPendingState.stateRoot,
+ currentPendingState.exitRoot,
+ pendingStateNum
+ );
+ }
+
+ /////////////////////////////////
+ // Soundness protection functions
+ /////////////////////////////////
+
+ /**
+ * @notice Allows the trusted aggregator to override the pending state
+ * if it's possible to prove a different state root given the same batches
+ * @param rollupID Rollup identifier
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function overridePendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) external onlyRole(_TRUSTED_AGGREGATOR_ROLE) {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _proveDistinctPendingState(
+ rollup,
+ initPendingStateNum,
+ finalPendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ proof
+ );
+
+ // Consolidate state
+ rollup.lastVerifiedBatch = finalNewBatch;
+ rollup.batchNumToStateRoot[finalNewBatch] = newStateRoot;
+ rollup.lastLocalExitRoot = newLocalExitRoot;
+
+ // Clean pending state if any
+ if (rollup.lastPendingState > 0) {
+ rollup.lastPendingState = 0;
+ rollup.lastPendingStateConsolidated = 0;
+ }
+
+ // Interact with globalExitRootManager
+ globalExitRootManager.updateExitRoot(getRollupExitRoot());
+
+ // Update trusted aggregator timeout to max
+ trustedAggregatorTimeout = _HALT_AGGREGATION_TIMEOUT;
+
+ emit OverridePendingState(
+ rollupID,
+ finalNewBatch,
+ newStateRoot,
+ newLocalExitRoot,
+ msg.sender
+ );
+ }
+
+ /**
+ * @notice Allows activate the emergency state if its possible to prove a different state root given the same batches
+ * @param rollupID Rollup identifier
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function proveNonDeterministicPendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) external ifNotEmergencyState {
+ RollupData storage rollup = rollupIDToRollupData[rollupID];
+
+ _proveDistinctPendingState(
+ rollup,
+ initPendingStateNum,
+ finalPendingStateNum,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ proof
+ );
+
+ emit ProveNonDeterministicPendingState(
+ rollup.pendingStateTransitions[finalPendingStateNum].stateRoot,
+ newStateRoot
+ );
+
+ // Activate emergency state
+ _activateEmergencyState();
+ }
+
+ /**
+ * @notice Internal function that proves a different state root given the same batches to verify
+ * @param rollup Rollup Data struct that will be checked
+ * @param initPendingStateNum Init pending state, 0 if consolidated state is used
+ * @param finalPendingStateNum Final pending state, that will be used to compare with the newStateRoot
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ * @param proof Fflonk proof
+ */
+ function _proveDistinctPendingState(
+ RollupData storage rollup,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] calldata proof
+ ) internal view virtual {
+ bytes32 oldStateRoot;
+
+ if (initNumBatch < rollup.lastVerifiedBatchBeforeUpgrade) {
+ revert InitBatchMustMatchCurrentForkID();
+ }
+
+ // Use pending state if specified, otherwise use consolidated state
+ if (initPendingStateNum != 0) {
+ // Check that pending state exist
+ // Already consolidated pending states can be used aswell
+ if (initPendingStateNum > rollup.lastPendingState) {
+ revert PendingStateDoesNotExist();
+ }
+
+ // Check choosen pending state
+ PendingState storage initPendingState = rollup
+ .pendingStateTransitions[initPendingStateNum];
+
+ // Get oldStateRoot from init pending state
+ oldStateRoot = initPendingState.stateRoot;
+
+ // Check initNumBatch matches the init pending state
+ if (initNumBatch != initPendingState.lastVerifiedBatch) {
+ revert InitNumBatchDoesNotMatchPendingState();
+ }
+ } else {
+ // Use consolidated state
+ oldStateRoot = rollup.batchNumToStateRoot[initNumBatch];
+ if (oldStateRoot == bytes32(0)) {
+ revert OldStateRootDoesNotExist();
+ }
+
+ // Check initNumBatch is inside the range, sanity check
+ if (initNumBatch > rollup.lastVerifiedBatch) {
+ revert InitNumBatchAboveLastVerifiedBatch();
+ }
+ }
+
+ // Assert final pending state num is in correct range
+ // - exist ( has been added)
+ // - bigger than the initPendingstate
+ // - not consolidated
+ if (
+ finalPendingStateNum > rollup.lastPendingState ||
+ finalPendingStateNum <= initPendingStateNum ||
+ finalPendingStateNum <= rollup.lastPendingStateConsolidated
+ ) {
+ revert FinalPendingStateNumInvalid();
+ }
+
+ // Check final num batch
+ if (
+ finalNewBatch !=
+ rollup
+ .pendingStateTransitions[finalPendingStateNum]
+ .lastVerifiedBatch
+ ) {
+ revert FinalNumBatchDoesNotMatchPendingState();
+ }
+
+ // Get snark bytes
+ bytes memory snarkHashBytes = _getInputSnarkBytes(
+ rollup,
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+
+ // Calulate the snark input
+ uint256 inputSnark = uint256(sha256(snarkHashBytes)) % _RFIELD;
+
+ // Verify proof
+ if (!rollup.verifier.verifyProof(proof, [inputSnark])) {
+ revert InvalidProof();
+ }
+
+ if (
+ rollup.pendingStateTransitions[finalPendingStateNum].stateRoot ==
+ newStateRoot
+ ) {
+ revert StoredRootMustBeDifferentThanNewRoot();
+ }
+ }
+
+ /**
+ * @notice Function to update the batch fee based on the new verified batches
+ * The batch fee will not be updated when the trusted aggregator verifies batches
+ * @param newLastVerifiedBatch New last verified batch
+ */
+ function _updateBatchFee(
+ RollupData storage rollup,
+ uint64 newLastVerifiedBatch
+ ) internal {
+ uint64 currentLastVerifiedBatch = _getLastVerifiedBatch(rollup);
+ uint64 currentBatch = newLastVerifiedBatch;
+
+ uint256 totalBatchesAboveTarget;
+ uint256 newBatchesVerified = newLastVerifiedBatch -
+ currentLastVerifiedBatch;
+
+ uint256 targetTimestamp = block.timestamp - verifyBatchTimeTarget;
+
+ while (currentBatch != currentLastVerifiedBatch) {
+ // Load sequenced batchdata
+ SequencedBatchData storage currentSequencedBatchData = rollup
+ .sequencedBatches[currentBatch];
+
+ // Check if timestamp is below the verifyBatchTimeTarget
+ if (
+ targetTimestamp < currentSequencedBatchData.sequencedTimestamp
+ ) {
+ // update currentBatch
+ currentBatch = currentSequencedBatchData
+ .previousLastBatchSequenced;
+ } else {
+ // The rest of batches will be above
+ totalBatchesAboveTarget =
+ currentBatch -
+ currentLastVerifiedBatch;
+ break;
+ }
+ }
+
+ uint256 totalBatchesBelowTarget = newBatchesVerified -
+ totalBatchesAboveTarget;
+
+ // _MAX_BATCH_FEE --> (< 70 bits)
+ // multiplierBatchFee --> (< 10 bits)
+ // _MAX_BATCH_MULTIPLIER = 12
+ // multiplierBatchFee ** _MAX_BATCH_MULTIPLIER --> (< 128 bits)
+ // batchFee * (multiplierBatchFee ** _MAX_BATCH_MULTIPLIER)-->
+ // (< 70 bits) * (< 128 bits) = < 256 bits
+
+ // Since all the following operations cannot overflow, we can optimize this operations with unchecked
+ unchecked {
+ if (totalBatchesBelowTarget < totalBatchesAboveTarget) {
+ // There are more batches above target, fee is multiplied
+ uint256 diffBatches = totalBatchesAboveTarget -
+ totalBatchesBelowTarget;
+
+ diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
+ ? _MAX_BATCH_MULTIPLIER
+ : diffBatches;
+
+ // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
+ _batchFee =
+ (_batchFee * (uint256(multiplierBatchFee) ** diffBatches)) /
+ (uint256(1000) ** diffBatches);
+ } else {
+ // There are more batches below target, fee is divided
+ uint256 diffBatches = totalBatchesBelowTarget -
+ totalBatchesAboveTarget;
+
+ diffBatches = diffBatches > _MAX_BATCH_MULTIPLIER
+ ? _MAX_BATCH_MULTIPLIER
+ : diffBatches;
+
+ // For every multiplierBatchFee multiplication we must shift 3 zeroes since we have 3 decimals
+ uint256 accDivisor = (uint256(1 ether) *
+ (uint256(multiplierBatchFee) ** diffBatches)) /
+ (uint256(1000) ** diffBatches);
+
+ // multiplyFactor = multiplierBatchFee ** diffBatches / 10 ** (diffBatches * 3)
+ // accDivisor = 1E18 * multiplyFactor
+ // 1E18 * batchFee / accDivisor = batchFee / multiplyFactor
+ // < 60 bits * < 70 bits / ~60 bits --> overflow not possible
+ _batchFee = (uint256(1 ether) * _batchFee) / accDivisor;
+ }
+ }
+
+ // Batch fee must remain inside a range
+ if (_batchFee > _MAX_BATCH_FEE) {
+ _batchFee = _MAX_BATCH_FEE;
+ } else if (_batchFee < _MIN_BATCH_FEE) {
+ _batchFee = _MIN_BATCH_FEE;
+ }
+ }
+
+ ////////////////////////
+ // Emergency state functions
+ ////////////////////////
+
+ /**
+ * @notice Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ * If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period
+ */
+ function activateEmergencyState() external {
+ if (!hasRole(_EMERGENCY_COUNCIL_ROLE, msg.sender)) {
+ if (
+ lastAggregationTimestamp == 0 ||
+ lastAggregationTimestamp + _HALT_AGGREGATION_TIMEOUT >
+ block.timestamp ||
+ lastDeactivatedEmergencyStateTimestamp +
+ _HALT_AGGREGATION_TIMEOUT >
+ block.timestamp
+ ) {
+ revert HaltTimeoutNotExpired();
+ }
+ }
+ _activateEmergencyState();
+ }
+
+ /**
+ * @notice Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ */
+ function deactivateEmergencyState()
+ external
+ onlyRole(_STOP_EMERGENCY_ROLE)
+ {
+ // Set last deactivated emergency state
+ lastDeactivatedEmergencyStateTimestamp = uint64(block.timestamp);
+
+ // Deactivate emergency state on PolygonZkEVMBridge
+ bridgeAddress.deactivateEmergencyState();
+
+ // Deactivate emergency state on this contract
+ super._deactivateEmergencyState();
+ }
+
+ /**
+ * @notice Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+ */
+ function _activateEmergencyState() internal override {
+ // Activate emergency state on PolygonZkEVM Bridge
+ bridgeAddress.activateEmergencyState();
+
+ // Activate emergency state on this contract
+ super._activateEmergencyState();
+ }
+
+ //////////////////
+ // Setter functions
+ //////////////////
+
+ /**
+ * @notice Set a new pending state timeout
+ * The timeout can only be lowered, except if emergency state is active
+ * @param newTrustedAggregatorTimeout Trusted aggregator timeout
+ */
+ function setTrustedAggregatorTimeout(
+ uint64 newTrustedAggregatorTimeout
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (!isEmergencyState) {
+ if (newTrustedAggregatorTimeout >= trustedAggregatorTimeout) {
+ revert NewTrustedAggregatorTimeoutMustBeLower();
+ }
+ }
+
+ trustedAggregatorTimeout = newTrustedAggregatorTimeout;
+ emit SetTrustedAggregatorTimeout(newTrustedAggregatorTimeout);
+ }
+
+ /**
+ * @notice Set a new trusted aggregator timeout
+ * The timeout can only be lowered, except if emergency state is active
+ * @param newPendingStateTimeout Trusted aggregator timeout
+ */
+ function setPendingStateTimeout(
+ uint64 newPendingStateTimeout
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (!isEmergencyState) {
+ if (newPendingStateTimeout >= pendingStateTimeout) {
+ revert NewPendingStateTimeoutMustBeLower();
+ }
+ }
+
+ pendingStateTimeout = newPendingStateTimeout;
+ emit SetPendingStateTimeout(newPendingStateTimeout);
+ }
+
+ /**
+ * @notice Set a new multiplier batch fee
+ * @param newMultiplierBatchFee multiplier batch fee
+ */
+ function setMultiplierBatchFee(
+ uint16 newMultiplierBatchFee
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (newMultiplierBatchFee < 1000 || newMultiplierBatchFee > 1023) {
+ revert InvalidRangeMultiplierBatchFee();
+ }
+
+ multiplierBatchFee = newMultiplierBatchFee;
+ emit SetMultiplierBatchFee(newMultiplierBatchFee);
+ }
+
+ /**
+ * @notice Set a new verify batch time target
+ * This value will only be relevant once the aggregation is decentralized, so
+ * the trustedAggregatorTimeout should be zero or very close to zero
+ * @param newVerifyBatchTimeTarget Verify batch time target
+ */
+ function setVerifyBatchTimeTarget(
+ uint64 newVerifyBatchTimeTarget
+ ) external onlyRole(_TWEAK_PARAMETERS_ROLE) {
+ if (newVerifyBatchTimeTarget > 1 days) {
+ revert InvalidRangeBatchTimeTarget();
+ }
+ verifyBatchTimeTarget = newVerifyBatchTimeTarget;
+ emit SetVerifyBatchTimeTarget(newVerifyBatchTimeTarget);
+ }
+
+ /**
+ * @notice Set the current batch fee
+ * @param newBatchFee new batch fee
+ */
+ function setBatchFee(uint256 newBatchFee) external onlyRole(_SET_FEE_ROLE) {
+ // check fees min and max
+ if (newBatchFee > _MAX_BATCH_FEE || newBatchFee < _MIN_BATCH_FEE) {
+ revert BatchFeeOutOfRange();
+ }
+ _batchFee = newBatchFee;
+ emit SetBatchFee(newBatchFee);
+ }
+
+ ////////////////////////
+ // view/pure functions
+ ///////////////////////
+
+ /**
+ * @notice Get the current rollup exit root
+ * Compute using all the local exit roots of all rollups the rollup exit root
+ * Since it's expected to have no more than 10 rollups in this first version, even if this approach
+ * has a gas consumption that scales linearly with the rollups added, it's ok
+ * In a future versions this computation will be done inside the circuit
+ */
+ function getRollupExitRoot() public view returns (bytes32) {
+ uint256 currentNodes = rollupCount;
+
+ // If there are no nodes return 0
+ if (currentNodes == 0) {
+ return bytes32(0);
+ }
+
+ // This array will contain the nodes of the current iteration
+ bytes32[] memory tmpTree = new bytes32[](currentNodes);
+
+ // In the first iteration the nodes will be the leafs which are the local exit roots of each network
+ for (uint256 i = 0; i < currentNodes; i++) {
+ // The first rollup ID starts on 1
+ tmpTree[i] = rollupIDToRollupData[uint32(i + 1)].lastLocalExitRoot;
+ }
+
+ // This variable will keep track of the zero hashes
+ bytes32 currentZeroHashHeight = 0;
+
+ // This variable will keep track of the reamining levels to compute
+ uint256 remainingLevels = _EXIT_TREE_DEPTH;
+
+ // Calculate the root of the sub-tree that contains all the localExitRoots
+ while (currentNodes != 1) {
+ uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2);
+ bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes);
+ for (uint256 i = 0; i < nextIterationNodes; i++) {
+ // if we are on the last iteration of the current level and the nodes are odd
+ if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) {
+ nextTmpTree[i] = keccak256(
+ abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight)
+ );
+ } else {
+ nextTmpTree[i] = keccak256(
+ abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1])
+ );
+ }
+ }
+
+ // Update tree variables
+ tmpTree = nextTmpTree;
+ currentNodes = nextIterationNodes;
+ currentZeroHashHeight = keccak256(
+ abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight)
+ );
+ remainingLevels--;
+ }
+
+ bytes32 currentRoot = tmpTree[0];
+
+ // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes
+ for (uint256 i = 0; i < remainingLevels; i++) {
+ currentRoot = keccak256(
+ abi.encodePacked(currentRoot, currentZeroHashHeight)
+ );
+ currentZeroHashHeight = keccak256(
+ abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight)
+ );
+ }
+ return currentRoot;
+ }
+
+ /**
+ * @notice Get the last verified batch
+ */
+ function getLastVerifiedBatch(
+ uint32 rollupID
+ ) public view returns (uint64) {
+ return _getLastVerifiedBatch(rollupIDToRollupData[rollupID]);
+ }
+
+ /**
+ * @notice Get the last verified batch
+ */
+ function _getLastVerifiedBatch(
+ RollupData storage rollup
+ ) internal view returns (uint64) {
+ if (rollup.lastPendingState > 0) {
+ return
+ rollup
+ .pendingStateTransitions[rollup.lastPendingState]
+ .lastVerifiedBatch;
+ } else {
+ return rollup.lastVerifiedBatch;
+ }
+ }
+
+ /**
+ * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
+ * @param rollupID Rollup id
+ * @param pendingStateNum Pending state number to check
+ * Note that his function does not check if the pending state currently exists, or if it's consolidated already
+ */
+ function isPendingStateConsolidable(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) public view returns (bool) {
+ return
+ _isPendingStateConsolidable(
+ rollupIDToRollupData[rollupID],
+ pendingStateNum
+ );
+ }
+
+ /**
+ * @notice Returns a boolean that indicates if the pendingStateNum is or not consolidable
+ * @param rollup Rollup data storage pointer
+ * @param pendingStateNum Pending state number to check
+ * Note that his function does not check if the pending state currently exists, or if it's consolidated already
+ */
+ function _isPendingStateConsolidable(
+ RollupData storage rollup,
+ uint64 pendingStateNum
+ ) internal view returns (bool) {
+ return (rollup.pendingStateTransitions[pendingStateNum].timestamp +
+ pendingStateTimeout <=
+ block.timestamp);
+ }
+
+ /**
+ * @notice Function to calculate the reward to verify a single batch
+ */
+ function calculateRewardPerBatch() public view returns (uint256) {
+ uint256 currentBalance = pol.balanceOf(address(this));
+
+ // Total Batches to be verified = total Sequenced Batches - total verified Batches
+ uint256 totalBatchesToVerify = totalSequencedBatches -
+ totalVerifiedBatches;
+
+ if (totalBatchesToVerify == 0) return 0;
+ return currentBalance / totalBatchesToVerify;
+ }
+
+ /**
+ * @notice Get batch fee
+ * This function is used instad of the automatic public view one,
+ * because in a future might change the behaviour and we will be able to mantain the interface
+ */
+ function getBatchFee() public view returns (uint256) {
+ return _batchFee;
+ }
+
+ /**
+ * @notice Get forced batch fee
+ */
+ function getForcedBatchFee() public view returns (uint256) {
+ return _batchFee * 100;
+ }
+
+ /**
+ * @notice Function to calculate the input snark bytes
+ * @param rollupID Rollup id used to calculate the input snark bytes
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param oldStateRoot State root before batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function getInputSnarkBytes(
+ uint32 rollupID,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) public view returns (bytes memory) {
+ return
+ _getInputSnarkBytes(
+ rollupIDToRollupData[rollupID],
+ initNumBatch,
+ finalNewBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+ }
+
+ /**
+ * @notice Function to calculate the input snark bytes
+ * @param rollup Rollup data storage pointer
+ * @param initNumBatch Batch which the aggregator starts the verification
+ * @param finalNewBatch Last batch aggregator intends to verify
+ * @param newLocalExitRoot New local exit root once the batch is processed
+ * @param oldStateRoot State root before batch is processed
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function _getInputSnarkBytes(
+ RollupData storage rollup,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) internal view returns (bytes memory) {
+ // Sanity check
+ bytes32 oldAccInputHash = rollup
+ .sequencedBatches[initNumBatch]
+ .accInputHash;
+
+ bytes32 newAccInputHash = rollup
+ .sequencedBatches[finalNewBatch]
+ .accInputHash;
+
+ // Sanity check
+ if (initNumBatch != 0 && oldAccInputHash == bytes32(0)) {
+ revert OldAccInputHashDoesNotExist();
+ }
+
+ if (newAccInputHash == bytes32(0)) {
+ revert NewAccInputHashDoesNotExist();
+ }
+
+ // Check that new state root is inside goldilocks field
+ if (!_checkStateRootInsidePrime(uint256(newStateRoot))) {
+ revert NewStateRootNotInsidePrime();
+ }
+
+ return
+ abi.encodePacked(
+ msg.sender,
+ oldStateRoot,
+ oldAccInputHash,
+ initNumBatch,
+ rollup.chainID,
+ rollup.forkID,
+ newStateRoot,
+ newAccInputHash,
+ newLocalExitRoot,
+ finalNewBatch
+ );
+ }
+
+ /**
+ * @notice Function to check if the state root is inside of the prime field
+ * @param newStateRoot New State root once the batch is processed
+ */
+ function _checkStateRootInsidePrime(
+ uint256 newStateRoot
+ ) internal pure returns (bool) {
+ if (
+ ((newStateRoot & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) &&
+ (((newStateRoot >> 64) & _MAX_UINT_64) < _GOLDILOCKS_PRIME_FIELD) &&
+ (((newStateRoot >> 128) & _MAX_UINT_64) <
+ _GOLDILOCKS_PRIME_FIELD) &&
+ ((newStateRoot >> 192) < _GOLDILOCKS_PRIME_FIELD)
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @notice Get rollup state root given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupBatchNumToStateRoot(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (bytes32) {
+ return rollupIDToRollupData[rollupID].batchNumToStateRoot[batchNum];
+ }
+
+ /**
+ * @notice Get rollup sequence batches struct given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupSequencedBatches(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (SequencedBatchData memory) {
+ return rollupIDToRollupData[rollupID].sequencedBatches[batchNum];
+ }
+
+ /**
+ * @notice Get rollup sequence pending state struct given a batch number
+ * @param rollupID Rollup identifier
+ * @param batchNum Batch number
+ */
+ function getRollupPendingStateTransitions(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public view returns (PendingState memory) {
+ return rollupIDToRollupData[rollupID].pendingStateTransitions[batchNum];
+ }
+}
\ No newline at end of file
diff --git a/contracts/v2/previousVersions/PolygonValidiumEtrogPrevious.sol b/contracts/v2/previousVersions/PolygonValidiumEtrogPrevious.sol
index a603c024a..73ae05fd2 100644
--- a/contracts/v2/previousVersions/PolygonValidiumEtrogPrevious.sol
+++ b/contracts/v2/previousVersions/PolygonValidiumEtrogPrevious.sol
@@ -80,6 +80,10 @@ contract PolygonValidiumEtrogPrevious is
/**
* @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+ * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+ * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
* @param dataAvailabilityMessage Byte array containing the signatures and all the addresses of the committee in ascending order
* [signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
@@ -88,6 +92,8 @@ contract PolygonValidiumEtrogPrevious is
*/
function sequenceBatchesValidium(
ValidiumBatchData[] calldata batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase,
bytes calldata dataAvailabilityMessage
) external onlyTrustedSequencer {
@@ -100,6 +106,13 @@ contract PolygonValidiumEtrogPrevious is
revert ExceedMaxVerifyBatches();
}
+ // Check max sequence timestamp inside of range
+ if (
+ uint256(maxSequenceTimestamp) > (block.timestamp + TIMESTAMP_RANGE)
+ ) {
+ revert MaxTimestampSequenceInvalid();
+ }
+
// Update global exit root if there are new deposits
bridgeAddress.updateGlobalExitRoot();
@@ -173,7 +186,7 @@ contract PolygonValidiumEtrogPrevious is
currentAccInputHash,
currentBatch.transactionsHash,
l1InfoRoot,
- uint64(block.timestamp),
+ maxSequenceTimestamp,
l2Coinbase,
bytes32(0)
)
@@ -229,22 +242,41 @@ contract PolygonValidiumEtrogPrevious is
currentAccInputHash
);
+ // Check init sequenced batch
+ if (
+ initSequencedBatch != (currentBatchSequenced - uint64(batchesNum))
+ ) {
+ revert InitSequencedBatchDoesNotMatch();
+ }
+
emit SequenceBatches(currentBatchSequenced, l1InfoRoot);
}
/**
- * @notice Allows a sequencer to send multiple batches sending all the data, and without using the dataAvailabilityProtocol
+ * @notice Allows a sequencer to send multiple batches
* @param batches Struct array which holds the necessary data to append new batches to the sequence
+ * @param maxSequenceTimestamp Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+ * This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+ * @param initSequencedBatch This parameter must match the current last batch sequenced.
+ * This will be a protection for the sequencer to avoid sending undesired data
* @param l2Coinbase Address that will receive the fees from L2
+ * note Pol is not a reentrant token
*/
function sequenceBatches(
BatchData[] calldata batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase
) public override {
if (!isSequenceWithDataAvailabilityAllowed) {
revert SequenceWithDataAvailabilityNotAllowed();
}
- super.sequenceBatches(batches, l2Coinbase);
+ super.sequenceBatches(
+ batches,
+ maxSequenceTimestamp,
+ initSequencedBatch,
+ l2Coinbase
+ );
}
//////////////////
diff --git a/contracts/v2/sovereignChains/BridgeL2SovereignChain.sol b/contracts/v2/sovereignChains/BridgeL2SovereignChain.sol
new file mode 100644
index 000000000..11ee1c5a3
--- /dev/null
+++ b/contracts/v2/sovereignChains/BridgeL2SovereignChain.sol
@@ -0,0 +1,625 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity 0.8.20;
+
+import "../interfaces/IBridgeL2SovereignChains.sol";
+import "../PolygonZkEVMBridgeV2.sol";
+
+/**
+ * Sovereign chains bridge that will be deployed on all Sovereign chains
+ * Contract responsible to manage the token interactions with other networks
+ * This contract is not meant to replace the current zkEVM bridge contract, but deployed on sovereign networks
+ */
+contract BridgeL2SovereignChain is
+ PolygonZkEVMBridgeV2,
+ IBridgeL2SovereignChains
+{
+ using SafeERC20Upgradeable for IERC20Upgradeable;
+
+ // Map to store wrappedAddresses that are not mintable
+ mapping(address wrappedAddress => bool isNotMintable)
+ public wrappedAddressIsNotMintable;
+
+ // Bridge manager address; can set custom mapping for any token. It's highly recommend to set a timelock at this address after bootstrapping phase
+ address public bridgeManager;
+
+ /**
+ * @dev Emitted when a bridge manager is updated
+ */
+ event SetBridgeManager(address bridgeManager);
+
+ /**
+ * @dev Emitted when a claim is unset
+ */
+ event UnsetClaim(uint32 leafIndex, uint32 sourceBridgeNetwork);
+
+ /**
+ * @dev Emitted when a token address is remapped by a sovereign token address
+ */
+ event SetSovereignTokenAddress(
+ uint32 originNetwork,
+ address originTokenAddress,
+ address sovereignTokenAddress,
+ bool isNotMintable
+ );
+
+ /**
+ * @dev Emitted when a legacy token is migrated to a new token
+ */
+ event MigrateLegacyToken(
+ address sender,
+ address legacyTokenAddress,
+ address updatedTokenAddress,
+ uint256 amount
+ );
+
+ /**
+ * @dev Emitted when a remapped token is removed from mapping
+ */
+ event RemoveLegacySovereignTokenAddress(address sovereignTokenAddress);
+
+ /**
+ * @dev Emitted when a WETH address is remapped by a sovereign WETH address
+ */
+ event SetSovereignWETHAddress(
+ address sovereignWETHTokenAddress,
+ bool isNotMintable
+ );
+
+ /**
+ * Disable initializers on the implementation following the best practices
+ */
+ constructor() {
+ _disableInitializers();
+ }
+
+ /**
+ * @param _networkID networkID
+ * @param _gasTokenAddress gas token address
+ * @param _gasTokenNetwork gas token network
+ * @param _globalExitRootManager global exit root manager address
+ * @param _polygonRollupManager Rollup manager address
+ * @notice The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so
+ * emergency state is not possible for the L2 deployment of the bridge, intentionally
+ * @param _gasTokenMetadata Abi encoded gas token metadata
+ * @param _bridgeManager bridge manager address
+ * @param _sovereignWETHAddress sovereign WETH address
+ * @param _sovereignWETHAddressIsNotMintable Flag to indicate if the wrapped ETH is not mintable
+ */
+ function initialize(
+ uint32 _networkID,
+ address _gasTokenAddress,
+ uint32 _gasTokenNetwork,
+ IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager,
+ address _polygonRollupManager,
+ bytes memory _gasTokenMetadata,
+ address _bridgeManager,
+ address _sovereignWETHAddress,
+ bool _sovereignWETHAddressIsNotMintable
+ ) public virtual initializer {
+ networkID = _networkID;
+ globalExitRootManager = _globalExitRootManager;
+ polygonRollupManager = _polygonRollupManager;
+ bridgeManager = _bridgeManager;
+
+ // Set gas token
+ if (_gasTokenAddress == address(0)) {
+ // Gas token will be ether
+ if (_gasTokenNetwork != 0) {
+ revert GasTokenNetworkMustBeZeroOnEther();
+ }
+ // Health check for sovereign WETH address
+ if (
+ _sovereignWETHAddress != address(0) ||
+ _sovereignWETHAddressIsNotMintable
+ ) {
+ revert InvalidSovereignWETHAddressParams();
+ }
+ // WETHToken, gasTokenAddress and gasTokenNetwork will be 0
+ // gasTokenMetadata will be empty
+ } else {
+ // Gas token will be an erc20
+ gasTokenAddress = _gasTokenAddress;
+ gasTokenNetwork = _gasTokenNetwork;
+ gasTokenMetadata = _gasTokenMetadata;
+
+ // Set sovereign weth token or create new if not provided
+ if (_sovereignWETHAddress == address(0)) {
+ // Health check for sovereign WETH address is mintable
+ if (_sovereignWETHAddressIsNotMintable == true) {
+ revert InvalidSovereignWETHAddressParams();
+ }
+ // Create a wrapped token for WETH, with salt == 0
+ WETHToken = _deployWrappedToken(
+ 0, // salt
+ abi.encode("Wrapped Ether", "WETH", 18)
+ );
+ } else {
+ WETHToken = TokenWrapped(_sovereignWETHAddress);
+ wrappedAddressIsNotMintable[
+ _sovereignWETHAddress
+ ] = _sovereignWETHAddressIsNotMintable;
+ }
+ }
+
+ // Initialize OZ contracts
+ __ReentrancyGuard_init();
+ }
+
+ /**
+ * @notice Override the function to prevent the contract from being initialized with this initializer
+ */
+ function initialize(
+ uint32, // _networkID
+ address, //_gasTokenAddress
+ uint32, //_gasTokenNetwork
+ IBasePolygonZkEVMGlobalExitRoot, //_globalExitRootManager
+ address, //_polygonRollupManager
+ bytes memory //_gasTokenMetadata
+ )
+ external
+ override(IPolygonZkEVMBridgeV2, PolygonZkEVMBridgeV2)
+ initializer
+ {
+ revert InvalidInitializeFunction();
+ }
+
+ modifier onlyBridgeManager() {
+ if (bridgeManager != msg.sender) {
+ revert OnlyBridgeManager();
+ }
+ _;
+ }
+
+ /**
+ * @notice Remap multiple wrapped tokens to a new sovereign token address
+ * @dev This function is a "multi/batch call" to `setSovereignTokenAddress`
+ * @param originNetworks Array of Origin networks
+ * @param originTokenAddresses Array od Origin token addresses, 0 address is reserved for ether
+ * @param sovereignTokenAddresses Array of Addresses of the sovereign wrapped token
+ * @param isNotMintable Array of Flags to indicate if the wrapped token is not mintable
+ */
+ function setMultipleSovereignTokenAddress(
+ uint32[] memory originNetworks,
+ address[] memory originTokenAddresses,
+ address[] memory sovereignTokenAddresses,
+ bool[] memory isNotMintable
+ ) external onlyBridgeManager {
+ if (
+ originNetworks.length != originTokenAddresses.length ||
+ originNetworks.length != sovereignTokenAddresses.length ||
+ originNetworks.length != isNotMintable.length
+ ) {
+ revert InputArraysLengthMismatch();
+ }
+
+ // Make multiple calls to setSovereignTokenAddress
+ for (uint256 i = 0; i < sovereignTokenAddresses.length; i++) {
+ _setSovereignTokenAddress(
+ originNetworks[i],
+ originTokenAddresses[i],
+ sovereignTokenAddresses[i],
+ isNotMintable[i]
+ );
+ }
+ }
+
+ /**
+ * @notice Remap a wrapped token to a new sovereign token address
+ * @dev This function is used to allow any existing token to be mapped with
+ * origin token.
+ * @notice If this function is called multiple times for the same existingTokenAddress,
+ * this will override the previous calls and only keep the last sovereignTokenAddress.
+ * @notice The tokenInfoToWrappedToken mapping value is replaced by the new sovereign address but it's not the case for the wrappedTokenToTokenInfo map where the value is added, this way user will always be able to withdraw their tokens
+ * @notice The number of decimals between sovereign token and origin token is not checked, it doesn't affect the bridge functionality but the UI.
+ * @param originNetwork Origin network
+ * @param originTokenAddress Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
+ * @param sovereignTokenAddress Address of the sovereign wrapped token
+ * @param isNotMintable Flag to indicate if the wrapped token is not mintable
+ */
+ function _setSovereignTokenAddress(
+ uint32 originNetwork,
+ address originTokenAddress,
+ address sovereignTokenAddress,
+ bool isNotMintable
+ ) internal {
+ // origin and sovereign token address are not 0
+ if (
+ originTokenAddress == address(0) ||
+ sovereignTokenAddress == address(0)
+ ) {
+ revert InvalidZeroAddress();
+ }
+ // originNetwork != current network, wrapped tokens are always from other networks
+ if (originNetwork == networkID) {
+ revert OriginNetworkInvalid();
+ }
+ // Check if the token is already mapped
+ if (
+ wrappedTokenToTokenInfo[sovereignTokenAddress].originTokenAddress !=
+ address(0)
+ ) {
+ revert TokenAlreadyMapped();
+ }
+
+ // Compute token info hash
+ bytes32 tokenInfoHash = keccak256(
+ abi.encodePacked(originNetwork, originTokenAddress)
+ );
+ // Set the address of the wrapper
+ tokenInfoToWrappedToken[tokenInfoHash] = sovereignTokenAddress;
+ // Set the token info mapping
+ // @note wrappedTokenToTokenInfo mapping is not overwritten while tokenInfoToWrappedToken it is
+ wrappedTokenToTokenInfo[sovereignTokenAddress] = TokenInformation(
+ originNetwork,
+ originTokenAddress
+ );
+ wrappedAddressIsNotMintable[sovereignTokenAddress] = isNotMintable;
+ emit SetSovereignTokenAddress(
+ originNetwork,
+ originTokenAddress,
+ sovereignTokenAddress,
+ isNotMintable
+ );
+ }
+
+ /**
+ * @notice Remove the address of a remapped token from the mapping. Used to stop supporting legacy sovereign tokens
+ * @notice It also removes the token from the isNotMintable mapping
+ * @notice Although the token is removed from the mapping, the user will still be able to withdraw their tokens using tokenInfoToWrappedToken mapping
+ * @param legacySovereignTokenAddress Address of the sovereign wrapped token
+ */
+ function removeLegacySovereignTokenAddress(
+ address legacySovereignTokenAddress
+ ) external onlyBridgeManager {
+ // Only allow to remove already remapped tokens
+ TokenInformation memory tokenInfo = wrappedTokenToTokenInfo[
+ legacySovereignTokenAddress
+ ];
+ bytes32 tokenInfoHash = keccak256(
+ abi.encodePacked(
+ tokenInfo.originNetwork,
+ tokenInfo.originTokenAddress
+ )
+ );
+
+ if (
+ tokenInfoToWrappedToken[tokenInfoHash] == address(0) ||
+ tokenInfoToWrappedToken[tokenInfoHash] ==
+ legacySovereignTokenAddress
+ ) {
+ revert TokenNotRemapped();
+ }
+ delete wrappedTokenToTokenInfo[legacySovereignTokenAddress];
+ delete wrappedAddressIsNotMintable[legacySovereignTokenAddress];
+ emit RemoveLegacySovereignTokenAddress(legacySovereignTokenAddress);
+ }
+
+ /**
+ * @notice Set the custom wrapper for weth
+ * @notice If this function is called multiple times this will override the previous calls and only keep the last WETHToken.
+ * @notice WETH will not maintain legacy versions.Users easily should be able to unwrapp the legacy WETH and unwrapp it with the new one.
+ * @param sovereignWETHTokenAddress Address of the sovereign weth token
+ * @param isNotMintable Flag to indicate if the wrapped token is not mintable
+ */
+ function setSovereignWETHAddress(
+ address sovereignWETHTokenAddress,
+ bool isNotMintable
+ ) external onlyBridgeManager {
+ if (gasTokenAddress == address(0)) {
+ revert WETHRemappingNotSupportedOnGasTokenNetworks();
+ }
+ WETHToken = TokenWrapped(sovereignWETHTokenAddress);
+ wrappedAddressIsNotMintable[sovereignWETHTokenAddress] = isNotMintable;
+ emit SetSovereignWETHAddress(sovereignWETHTokenAddress, isNotMintable);
+ }
+
+ /**
+ * @notice Moves old native or remapped token (legacy) to the new mapped token. If the token is mintable, it will be burnt and minted, otherwise it will be transferred
+ * @param legacyTokenAddress Address of legacy token to migrate
+ * @param amount Legacy token balance to migrate
+ */
+ function migrateLegacyToken(
+ address legacyTokenAddress,
+ uint256 amount
+ ) external {
+ // Get current wrapped token address
+ TokenInformation memory legacyTokenInfo = wrappedTokenToTokenInfo[
+ legacyTokenAddress
+ ];
+ if (legacyTokenInfo.originTokenAddress == address(0)) {
+ revert TokenNotMapped();
+ }
+
+ // Check current token mapped is proposed updatedTokenAddress
+ address currentTokenAddress = tokenInfoToWrappedToken[
+ keccak256(
+ abi.encodePacked(
+ legacyTokenInfo.originNetwork,
+ legacyTokenInfo.originTokenAddress
+ )
+ )
+ ];
+
+ if (currentTokenAddress == legacyTokenAddress) {
+ revert TokenAlreadyUpdated();
+ }
+
+ // Proceed to migrate the token
+ _bridgeWrappedAsset(TokenWrapped(legacyTokenAddress), amount);
+ _claimWrappedAsset(
+ TokenWrapped(currentTokenAddress),
+ msg.sender,
+ amount
+ );
+
+ // Trigger event
+ emit MigrateLegacyToken(
+ msg.sender,
+ legacyTokenAddress,
+ currentTokenAddress,
+ amount
+ );
+ }
+
+ /**
+ * @notice unset multiple claims from the claimedBitmap
+ * @dev This function is a "multi/batch call" to `unsetClaimedBitmap`
+ * @param leafIndexes Array of Index
+ * @param sourceBridgeNetworks Array of Origin networks
+ */
+ function unsetMultipleClaimedBitmap(
+ uint32[] memory leafIndexes,
+ uint32[] memory sourceBridgeNetworks
+ ) external onlyBridgeManager {
+ if (leafIndexes.length != sourceBridgeNetworks.length) {
+ revert InputArraysLengthMismatch();
+ }
+
+ for (uint256 i = 0; i < leafIndexes.length; i++) {
+ _unsetClaimedBitmap(leafIndexes[i], sourceBridgeNetworks[i]);
+ }
+ }
+
+ /**
+ * @notice Updated bridge manager address, recommended to set a timelock at this address after bootstrapping phase
+ * @param _bridgeManager Bridge manager address
+ */
+ function setBridgeManager(
+ address _bridgeManager
+ ) external onlyBridgeManager {
+ bridgeManager = _bridgeManager;
+ emit SetBridgeManager(bridgeManager);
+ }
+
+ /**
+ * @notice Burn tokens from wrapped token to execute the bridge, if the token is not mintable it will be transferred
+ * note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+ * @param tokenWrapped Wrapped token to burnt
+ * @param amount Amount of tokens
+ */
+ function _bridgeWrappedAsset(
+ TokenWrapped tokenWrapped,
+ uint256 amount
+ ) internal override {
+ // The token is either (1) a correctly wrapped token from another network
+ // or (2) wrapped with custom contract from origin network
+ if (wrappedAddressIsNotMintable[address(tokenWrapped)]) {
+ // Don't use burn but transfer to bridge
+ IERC20Upgradeable(address(tokenWrapped)).safeTransferFrom(
+ msg.sender,
+ address(this),
+ amount
+ );
+ } else {
+ // Burn tokens
+ tokenWrapped.burn(msg.sender, amount);
+ }
+ }
+
+ /**
+ * @notice Mints tokens from wrapped token to proceed with the claim, if the token is not mintable it will be transferred
+ * note This function has been extracted to be able to override it by other contracts like BridgeL2SovereignChain
+ * @param tokenWrapped Wrapped token to mint
+ * @param destinationAddress Minted token receiver
+ * @param amount Amount of tokens
+ */
+ function _claimWrappedAsset(
+ TokenWrapped tokenWrapped,
+ address destinationAddress,
+ uint256 amount
+ ) internal override {
+ // If is not mintable transfer instead of mint
+ if (wrappedAddressIsNotMintable[address(tokenWrapped)]) {
+ // Transfer tokens
+ IERC20Upgradeable(address(tokenWrapped)).safeTransfer(
+ destinationAddress,
+ amount
+ );
+ } else {
+ // Claim tokens
+ tokenWrapped.mint(destinationAddress, amount);
+ }
+ }
+
+ /*
+ * @notice unset a claim from the claimedBitmap
+ * @param leafIndex Index
+ * @param sourceBridgeNetwork Origin network
+ */
+ function _unsetClaimedBitmap(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) private {
+ uint256 globalIndex = uint256(leafIndex) +
+ uint256(sourceBridgeNetwork) *
+ _MAX_LEAFS_PER_NETWORK;
+ (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex);
+ uint256 mask = 1 << bitPos;
+ uint256 flipped = claimedBitMap[wordPos] ^= mask;
+ if (flipped & mask != 0) {
+ revert ClaimNotSet();
+ }
+ emit UnsetClaim(leafIndex, sourceBridgeNetwork);
+ }
+
+ /**
+ * @notice Function to check if an index is claimed or not
+ * @dev function overridden to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+ * @param leafIndex Index
+ * @param sourceBridgeNetwork Origin network
+ */
+ function isClaimed(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) external view override returns (bool) {
+ uint256 globalIndex = uint256(leafIndex) +
+ uint256(sourceBridgeNetwork) *
+ _MAX_LEAFS_PER_NETWORK;
+
+ (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex);
+ uint256 mask = (1 << bitPos);
+ return (claimedBitMap[wordPos] & mask) == mask;
+ }
+
+ /**
+ * @notice Function to check that an index is not claimed and set it as claimed
+ * @dev function overridden to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+ * @param leafIndex Index
+ * @param sourceBridgeNetwork Origin network
+ */
+ function _setAndCheckClaimed(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) internal override {
+ uint256 globalIndex = uint256(leafIndex) +
+ uint256(sourceBridgeNetwork) *
+ _MAX_LEAFS_PER_NETWORK;
+ (uint256 wordPos, uint256 bitPos) = _bitmapPositions(globalIndex);
+ uint256 mask = 1 << bitPos;
+ uint256 flipped = claimedBitMap[wordPos] ^= mask;
+ if (flipped & mask == 0) {
+ revert AlreadyClaimed();
+ }
+ }
+
+ /**
+ * @notice Function to call token permit method of extended ERC20
+ * @dev function overridden from PolygonZkEVMBridgeV2 to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+ + @param token ERC20 token address
+ * @param amount Quantity that is expected to be allowed
+ * @param permitData Raw data of the call `permit` of the token
+ */
+ function _permit(
+ address token,
+ uint256 amount,
+ bytes calldata permitData
+ ) internal override {
+ bytes4 sig = bytes4(permitData[:4]);
+ if (sig == _PERMIT_SIGNATURE) {
+ (
+ address owner,
+ address spender,
+ uint256 value,
+ uint256 deadline,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) = abi.decode(
+ permitData[4:],
+ (
+ address,
+ address,
+ uint256,
+ uint256,
+ uint8,
+ bytes32,
+ bytes32
+ )
+ );
+
+ if (value != amount) {
+ revert NotValidAmount();
+ }
+
+ // we call without checking the result, in case it fails and he doesn't have enough balance
+ // the following transferFrom should be fail. This prevents DoS attacks from using a signature
+ // before the smartcontract call
+ /* solhint-disable avoid-low-level-calls */
+ address(token).call(
+ abi.encodeWithSelector(
+ _PERMIT_SIGNATURE,
+ owner,
+ spender,
+ value,
+ deadline,
+ v,
+ r,
+ s
+ )
+ );
+ } else {
+ if (sig != _PERMIT_SIGNATURE_DAI) {
+ revert NotValidSignature();
+ }
+
+ (
+ address holder,
+ address spender,
+ uint256 nonce,
+ uint256 expiry,
+ bool allowed,
+ uint8 v,
+ bytes32 r,
+ bytes32 s
+ ) = abi.decode(
+ permitData[4:],
+ (
+ address,
+ address,
+ uint256,
+ uint256,
+ bool,
+ uint8,
+ bytes32,
+ bytes32
+ )
+ );
+
+ // we call without checking the result, in case it fails and he doesn't have enough balance
+ // the following transferFrom should be fail. This prevents DoS attacks from using a signature
+ // before the smartcontract call
+ /* solhint-disable avoid-low-level-calls */
+ address(token).call(
+ abi.encodeWithSelector(
+ _PERMIT_SIGNATURE_DAI,
+ holder,
+ spender,
+ nonce,
+ expiry,
+ allowed,
+ v,
+ r,
+ s
+ )
+ );
+ }
+ }
+
+ // @note This function is not used in the current implementation. We overwrite it to improve deployed bytecode size
+ function activateEmergencyState()
+ external
+ pure
+ override(IPolygonZkEVMBridgeV2, PolygonZkEVMBridgeV2)
+ {
+ revert EmergencyStateNotAllowed();
+ }
+
+ function deactivateEmergencyState()
+ external
+ pure
+ override(IPolygonZkEVMBridgeV2, PolygonZkEVMBridgeV2)
+ {
+ revert EmergencyStateNotAllowed();
+ }
+}
diff --git a/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol b/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol
new file mode 100644
index 000000000..f1b0e7cd2
--- /dev/null
+++ b/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: AGPL-3.0
+
+pragma solidity 0.8.20;
+import "../../PolygonZkEVMGlobalExitRootL2.sol";
+import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
+
+/**
+ * Contract responsible for managing the exit roots for the Sovereign chains and global exit roots
+ */
+contract GlobalExitRootManagerL2SovereignChain is
+ PolygonZkEVMGlobalExitRootL2,
+ Initializable
+{
+ // globalExitRootUpdater address
+ address public globalExitRootUpdater;
+
+ // globalExitRootRemover address
+ // In case of initializing a chain with Full execution proofs, this address should be set to zero, otherwise, some malicious sequencer could insert invalid global exit roots, claim, go back and the execution would be correctly proved.
+ address public globalExitRootRemover;
+
+ // Inserted GER counter
+ uint256 public insertedGERCount;
+
+ /**
+ * @dev Emitted when a new global exit root is inserted
+ */
+ event InsertGlobalExitRoot(bytes32 indexed newGlobalExitRoot);
+
+ /**
+ * @dev Emitted when the last global exit root is removed
+ */
+ event RemoveLastGlobalExitRoot(bytes32 indexed removedGlobalExitRoot);
+
+ /**
+ * @dev Emitted when the globalExitRootUpdater is set
+ */
+ event SetGlobalExitRootUpdater(address indexed newGlobalExitRootUpdater);
+
+ /**
+ * @dev Emitted when the globalExitRootRemover is set
+ */
+ event SetGlobalExitRootRemover(address indexed newGlobalExitRootRemover);
+
+ /**
+ * @param _bridgeAddress PolygonZkEVMBridge contract address
+ */
+ constructor(
+ address _bridgeAddress
+ ) PolygonZkEVMGlobalExitRootL2(_bridgeAddress) {
+ _disableInitializers();
+ }
+
+ /**
+ * @notice Initialize contract
+ * @param _globalExitRootUpdater setting the globalExitRootUpdater.
+ * @param _globalExitRootRemover In case of initializing a chain with Full execution proofs, this address should be set to zero, otherwise, some malicious sequencer could insert invalid global exit roots, claim and go back and the execution would be correctly proved.
+ */
+ function initialize(
+ address _globalExitRootUpdater,
+ address _globalExitRootRemover
+ ) external virtual initializer {
+ // set globalExitRootUpdater
+ globalExitRootUpdater = _globalExitRootUpdater;
+ // set globalExitRootRemover
+ globalExitRootRemover = _globalExitRootRemover;
+ }
+
+ modifier onlyGlobalExitRootUpdater() {
+ // Only allowed to be called by GlobalExitRootUpdater or coinbase if GlobalExitRootUpdater is zero
+ if (globalExitRootUpdater == address(0)) {
+ if (block.coinbase != msg.sender) {
+ revert OnlyGlobalExitRootUpdater();
+ }
+ } else {
+ if (globalExitRootUpdater != msg.sender) {
+ revert OnlyGlobalExitRootUpdater();
+ }
+ }
+ _;
+ }
+
+ modifier onlyGlobalExitRootRemover() {
+ // Only allowed to be called by GlobalExitRootRemover
+ if (globalExitRootRemover != msg.sender) {
+ revert OnlyGlobalExitRootRemover();
+ }
+ _;
+ }
+ /**
+ * @notice Insert a new global exit root
+ * @param _newRoot new global exit root to insert
+ */
+ function insertGlobalExitRoot(
+ bytes32 _newRoot
+ ) external onlyGlobalExitRootUpdater {
+ // do not insert GER if already set
+ if (globalExitRootMap[_newRoot] == 0) {
+ globalExitRootMap[_newRoot] = ++insertedGERCount;
+ emit InsertGlobalExitRoot(_newRoot);
+ } else {
+ revert GlobalExitRootAlreadySet();
+ }
+ }
+
+ /**
+ * @notice Remove last global exit roots
+ * @param gersToRemove Array of gers to remove in inserted order where first element of the array is the last inserted
+ */
+ function removeLastGlobalExitRoots(
+ bytes32[] calldata gersToRemove
+ ) external onlyGlobalExitRootRemover {
+ uint256 insertedGERCountCache = insertedGERCount;
+ // Can't remove if not enough roots have been inserted
+ if (gersToRemove.length > insertedGERCountCache) {
+ revert NotEnoughGlobalExitRootsInserted();
+ }
+ // Iterate through the array of roots to remove them one by one
+ for (uint256 i = 0; i < gersToRemove.length; i++) {
+ bytes32 rootToRemove = gersToRemove[i];
+
+ // Check that the root to remove is the last inserted
+ uint256 lastInsertedIndex = globalExitRootMap[rootToRemove];
+ if (lastInsertedIndex != insertedGERCountCache) {
+ revert NotLastInsertedGlobalExitRoot();
+ }
+
+ // Remove from the mapping
+ delete globalExitRootMap[rootToRemove];
+ // Decrement the counter
+ insertedGERCountCache--;
+
+ // Emit the removal event
+ emit RemoveLastGlobalExitRoot(rootToRemove);
+ }
+ // Update the counter
+ insertedGERCount = insertedGERCountCache;
+ }
+
+ /**
+ * @notice Set the globalExitRootUpdater
+ * @param _globalExitRootUpdater new globalExitRootUpdater address
+ */
+ function setGlobalExitRootUpdater(
+ address _globalExitRootUpdater
+ ) external onlyGlobalExitRootUpdater {
+ globalExitRootUpdater = _globalExitRootUpdater;
+ emit SetGlobalExitRootUpdater(_globalExitRootUpdater);
+ }
+
+ /**
+ * @notice Set the globalExitRootRemover
+ * @param _globalExitRootRemover new globalExitRootRemover address
+ */
+ function setGlobalExitRootRemover(
+ address _globalExitRootRemover
+ ) external onlyGlobalExitRootRemover {
+ globalExitRootRemover = _globalExitRootRemover;
+ emit SetGlobalExitRootRemover(_globalExitRootRemover);
+ }
+}
diff --git a/contracts/v2/utils/ClaimCompressor.sol b/contracts/v2/utils/ClaimCompressor.sol
index 25a75ecf3..6c2319122 100644
--- a/contracts/v2/utils/ClaimCompressor.sol
+++ b/contracts/v2/utils/ClaimCompressor.sol
@@ -137,7 +137,7 @@ contract ClaimCompressor {
// Compute Rollup Root compressed
lastDifferentLevel = 0;
if (
- currentCompressClaimCalldata.smtProofRollupExitRoot[0] !=
+ currentCompressClaimCalldata.smtProofRollupExitRoot[31] !=
bytes32(0)
) {
if (i == 0 || !isRollupSmtSet) {
diff --git a/contracts/verifiers/FflonkVerifier_10.sol b/contracts/verifiers/FflonkVerifier_10.sol
index 95a7def5e..682c0e9ec 100644
--- a/contracts/verifiers/FflonkVerifier_10.sol
+++ b/contracts/verifiers/FflonkVerifier_10.sol
@@ -21,91 +21,117 @@
pragma solidity >=0.7.0 <0.9.0;
contract FflonkVerifier_10 {
- uint32 constant n = 16777216; // Domain size
+ uint32 constant n = 16777216; // Domain size
// Verification Key data
- uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H
- uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H
+ uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H
+ uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H
// OMEGAS
// Omega, Omega^{1/3}
- uint256 constant w1 = 5709868443893258075976348696661355716898495876243883251619397131511003808859;
- uint256 constant wr = 18200100796661656210024324131237448517259556535315737226009542456080026430510;
+ uint256 constant w1 =
+ 5709868443893258075976348696661355716898495876243883251619397131511003808859;
+ uint256 constant wr =
+ 18200100796661656210024324131237448517259556535315737226009542456080026430510;
// Omega_3, Omega_3^2
- uint256 constant w3 = 21888242871839275217838484774961031246154997185409878258781734729429964517155;
- uint256 constant w3_2 = 4407920970296243842393367215006156084916469457145843978461;
+ uint256 constant w3 =
+ 21888242871839275217838484774961031246154997185409878258781734729429964517155;
+ uint256 constant w3_2 =
+ 4407920970296243842393367215006156084916469457145843978461;
// Omega_4, Omega_4^2, Omega_4^3
- uint256 constant w4 = 21888242871839275217838484774961031246007050428528088939761107053157389710902;
- uint256 constant w4_2 = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
- uint256 constant w4_3 = 4407920970296243842541313971887945403937097133418418784715;
+ uint256 constant w4 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w4_2 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w4_3 =
+ 4407920970296243842541313971887945403937097133418418784715;
// Omega_8, Omega_8^2, Omega_8^3, Omega_8^4, Omega_8^5, Omega_8^6, Omega_8^7
- uint256 constant w8_1 = 19540430494807482326159819597004422086093766032135589407132600596362845576832;
- uint256 constant w8_2 = 21888242871839275217838484774961031246007050428528088939761107053157389710902;
- uint256 constant w8_3 = 13274704216607947843011480449124596415239537050559949017414504948711435969894;
- uint256 constant w8_4 = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
- uint256 constant w8_5 = 2347812377031792896086586148252853002454598368280444936565603590212962918785;
- uint256 constant w8_6 = 4407920970296243842541313971887945403937097133418418784715;
- uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723;
+ uint256 constant w8_1 =
+ 19540430494807482326159819597004422086093766032135589407132600596362845576832;
+ uint256 constant w8_2 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w8_3 =
+ 13274704216607947843011480449124596415239537050559949017414504948711435969894;
+ uint256 constant w8_4 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w8_5 =
+ 2347812377031792896086586148252853002454598368280444936565603590212962918785;
+ uint256 constant w8_6 =
+ 4407920970296243842541313971887945403937097133418418784715;
+ uint256 constant w8_7 =
+ 8613538655231327379234925296132678673308827349856085326283699237864372525723;
// Verifier preprocessed input C_0(x)·[1]_1
- uint256 constant C0x = 11210367295020917257703235313889457022168952188583021305208665558514331769248;
- uint256 constant C0y = 17059301660817115093380673187280876999008701101209472326054844504600568092098;
+ uint256 constant C0x =
+ 11210367295020917257703235313889457022168952188583021305208665558514331769248;
+ uint256 constant C0y =
+ 17059301660817115093380673187280876999008701101209472326054844504600568092098;
// Verifier preprocessed input x·[1]_2
- uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822;
- uint256 constant X2x2 = 17231025384763736816414546592865244497437017442647097510447326538965263639101;
- uint256 constant X2y1 = 2388026358213174446665280700919698872609886601280537296205114254867301080648;
- uint256 constant X2y2 = 11507326595632554467052522095592665270651932854513688777769618397986436103170;
+ uint256 constant X2x1 =
+ 21831381940315734285607113342023901060522397560371972897001948545212302161822;
+ uint256 constant X2x2 =
+ 17231025384763736816414546592865244497437017442647097510447326538965263639101;
+ uint256 constant X2y1 =
+ 2388026358213174446665280700919698872609886601280537296205114254867301080648;
+ uint256 constant X2y2 =
+ 11507326595632554467052522095592665270651932854513688777769618397986436103170;
// Scalar field size
- uint256 constant q = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+ uint256 constant q =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
// Base field size
- uint256 constant qf = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+ uint256 constant qf =
+ 21888242871839275222246405745257275088696311157297823662689037894645226208583;
// [1]_1
- uint256 constant G1x = 1;
- uint256 constant G1y = 2;
+ uint256 constant G1x = 1;
+ uint256 constant G1y = 2;
// [1]_2
- uint256 constant G2x1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
- uint256 constant G2x2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
- uint256 constant G2y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
- uint256 constant G2y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
+ uint256 constant G2x1 =
+ 10857046999023057135944570762232829481370756359578518086990519993285655852781;
+ uint256 constant G2x2 =
+ 11559732032986387107991004021392285783925812861821192530917403151452391805634;
+ uint256 constant G2y1 =
+ 8495653923123431417604973247489272438418190587263600148770280649306958101930;
+ uint256 constant G2y2 =
+ 4082367875863433681332203403145435568316851327593401208105741076214120093531;
// Proof calldata
// Byte offset of every parameter of the calldata
// Polynomial commitments
- uint16 constant pC1 = 4 + 0; // [C1]_1
- uint16 constant pC2 = 4 + 32*2; // [C2]_1
- uint16 constant pW1 = 4 + 32*4; // [W]_1
- uint16 constant pW2 = 4 + 32*6; // [W']_1
+ uint16 constant pC1 = 4 + 0; // [C1]_1
+ uint16 constant pC2 = 4 + 32 * 2; // [C2]_1
+ uint16 constant pW1 = 4 + 32 * 4; // [W]_1
+ uint16 constant pW2 = 4 + 32 * 6; // [W']_1
// Opening evaluations
- uint16 constant pEval_ql = 4 + 32*8; // q_L(xi)
- uint16 constant pEval_qr = 4 + 32*9; // q_R(xi)
- uint16 constant pEval_qm = 4 + 32*10; // q_M(xi)
- uint16 constant pEval_qo = 4 + 32*11; // q_O(xi)
- uint16 constant pEval_qc = 4 + 32*12; // q_C(xi)
- uint16 constant pEval_s1 = 4 + 32*13; // S_{sigma_1}(xi)
- uint16 constant pEval_s2 = 4 + 32*14; // S_{sigma_2}(xi)
- uint16 constant pEval_s3 = 4 + 32*15; // S_{sigma_3}(xi)
- uint16 constant pEval_a = 4 + 32*16; // a(xi)
- uint16 constant pEval_b = 4 + 32*17; // b(xi)
- uint16 constant pEval_c = 4 + 32*18; // c(xi)
- uint16 constant pEval_z = 4 + 32*19; // z(xi)
- uint16 constant pEval_zw = 4 + 32*20; // z_omega(xi)
- uint16 constant pEval_t1w = 4 + 32*21; // T_1(xi omega)
- uint16 constant pEval_t2w = 4 + 32*22; // T_2(xi omega)
- uint16 constant pEval_inv = 4 + 32*23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas,
- // we check the correctness of the inv(batch) by computing batch
- // and checking inv(batch) * batch == 1
+ uint16 constant pEval_ql = 4 + 32 * 8; // q_L(xi)
+ uint16 constant pEval_qr = 4 + 32 * 9; // q_R(xi)
+ uint16 constant pEval_qm = 4 + 32 * 10; // q_M(xi)
+ uint16 constant pEval_qo = 4 + 32 * 11; // q_O(xi)
+ uint16 constant pEval_qc = 4 + 32 * 12; // q_C(xi)
+ uint16 constant pEval_s1 = 4 + 32 * 13; // S_{sigma_1}(xi)
+ uint16 constant pEval_s2 = 4 + 32 * 14; // S_{sigma_2}(xi)
+ uint16 constant pEval_s3 = 4 + 32 * 15; // S_{sigma_3}(xi)
+ uint16 constant pEval_a = 4 + 32 * 16; // a(xi)
+ uint16 constant pEval_b = 4 + 32 * 17; // b(xi)
+ uint16 constant pEval_c = 4 + 32 * 18; // c(xi)
+ uint16 constant pEval_z = 4 + 32 * 19; // z(xi)
+ uint16 constant pEval_zw = 4 + 32 * 20; // z_omega(xi)
+ uint16 constant pEval_t1w = 4 + 32 * 21; // T_1(xi omega)
+ uint16 constant pEval_t2w = 4 + 32 * 22; // T_2(xi omega)
+ uint16 constant pEval_inv = 4 + 32 * 23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas,
+ // we check the correctness of the inv(batch) by computing batch
+ // and checking inv(batch) * batch == 1
// Memory data
// Challenges
- uint16 constant pAlpha = 0; // alpha challenge
- uint16 constant pBeta = 32; // beta challenge
- uint16 constant pGamma = 64; // gamma challenge
- uint16 constant pY = 96; // y challenge
- uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24
+ uint16 constant pAlpha = 0; // alpha challenge
+ uint16 constant pBeta = 32; // beta challenge
+ uint16 constant pGamma = 64; // gamma challenge
+ uint16 constant pY = 96; // y challenge
+ uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24
uint16 constant pXiSeed2 = 160; // (xi seed)^2
- uint16 constant pXi = 192; // xi challenge
+ uint16 constant pXi = 192; // xi challenge
// Roots
// S_0 = roots_8(xi) = { h_0, h_0w_8, h_0w_8^2, h_0w_8^3, h_0w_8^4, h_0w_8^5, h_0w_8^6, h_0w_8^7 }
@@ -134,40 +160,40 @@ contract FflonkVerifier_10 {
uint16 constant pH3w3_1 = 736;
uint16 constant pH3w3_2 = 768;
- uint16 constant pPi = 800; // PI(xi)
- uint16 constant pR0 = 832; // r0(y)
- uint16 constant pR1 = 864; // r1(y)
- uint16 constant pR2 = 896; // r2(y)
+ uint16 constant pPi = 800; // PI(xi)
+ uint16 constant pR0 = 832; // r0(y)
+ uint16 constant pR1 = 864; // r1(y)
+ uint16 constant pR2 = 896; // r2(y)
- uint16 constant pF = 928; // [F]_1, 64 bytes
- uint16 constant pE = 992; // [E]_1, 64 bytes
- uint16 constant pJ = 1056; // [J]_1, 64 bytes
+ uint16 constant pF = 928; // [F]_1, 64 bytes
+ uint16 constant pE = 992; // [E]_1, 64 bytes
+ uint16 constant pJ = 1056; // [J]_1, 64 bytes
- uint16 constant pZh = 1184; // Z_H(xi)
+ uint16 constant pZh = 1184; // Z_H(xi)
// From this point we write all the variables that must be computed using the Montgomery batch inversion
- uint16 constant pZhInv = 1216; // 1/Z_H(xi)
- uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) )
- uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) )
+ uint16 constant pZhInv = 1216; // 1/Z_H(xi)
+ uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) )
+ uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) )
uint16 constant pLiS0Inv = 1312; // Reserve 8 * 32 bytes to compute r_0(X)
uint16 constant pLiS1Inv = 1568; // Reserve 4 * 32 bytes to compute r_1(X)
uint16 constant pLiS2Inv = 1696; // Reserve 6 * 32 bytes to compute r_2(X)
// Lagrange evaluations
-
+
uint16 constant pEval_l1 = 1888;
-
-
+
uint16 constant lastMem = 1920;
-
- function verifyProof(bytes32[24] calldata proof, uint256[1] calldata pubSignals) public view returns (bool) {
+ function verifyProof(
+ bytes32[24] calldata proof,
+ uint256[1] calldata pubSignals
+ ) public view returns (bool) {
assembly {
// Computes the inverse of an array of values
// See https://vitalik.ca/general/2018/07/21/starks_part_3.html in section where explain fields operations
// To save the inverse to be computed on chain the prover sends the inverse as an evaluation in commits.eval_inv
function inverseArray(pMem) {
-
- let pAux := mload(0x40) // Point to the next free position
- let acc := mload(add(pMem,pZhInv)) // Read the first element
+ let pAux := mload(0x40) // Point to the next free position
+ let acc := mload(add(pMem, pZhInv)) // Read the first element
mstore(pAux, acc)
pAux := add(pAux, 32)
@@ -254,13 +280,12 @@ contract FflonkVerifier_10 {
acc := mulmod(acc, mload(add(pMem, pEval_l1)), q)
mstore(pAux, acc)
-
let inv := calldataload(pEval_inv)
// Before using the inverse sent by the prover the verifier checks inv(batch) * batch === 1
if iszero(eq(1, mulmod(acc, inv, q))) {
mstore(0, 0)
- return(0,0x20)
+ return(0, 0x20)
}
acc := inv
@@ -373,8 +398,8 @@ contract FflonkVerifier_10 {
mstore(0, 0)
return(0, 0x20)
}
- }
-
+ }
+
// Validate all the evaluations sent by the prover ∈ F
function checkInput() {
// Check proof commitments fullfill bn128 curve equation Y^2 = X^3 + 3
@@ -405,18 +430,22 @@ contract FflonkVerifier_10 {
function computeChallenges(pMem, pPublic) {
// Compute challenge.beta & challenge.gamma
- mstore(add(pMem, 1920 ), C0x)
- mstore(add(pMem, 1952 ), C0y)
+ mstore(add(pMem, 1920), C0x)
+ mstore(add(pMem, 1952), C0y)
mstore(add(pMem, 1984), calldataload(pPublic))
-
-
- mstore(add(pMem, 2016 ), calldataload(pC1))
- mstore(add(pMem, 2048 ), calldataload(add(pC1, 32)))
+ mstore(add(pMem, 2016), calldataload(pC1))
+ mstore(add(pMem, 2048), calldataload(add(pC1, 32)))
- mstore(add(pMem, pBeta), mod(keccak256(add(pMem, lastMem), 160), q))
- mstore(add(pMem, pGamma), mod(keccak256(add(pMem, pBeta), 32), q))
+ mstore(
+ add(pMem, pBeta),
+ mod(keccak256(add(pMem, lastMem), 160), q)
+ )
+ mstore(
+ add(pMem, pGamma),
+ mod(keccak256(add(pMem, pBeta), 32), q)
+ )
// Get xiSeed & xiSeed2
mstore(add(pMem, lastMem), mload(add(pMem, pGamma)))
@@ -428,99 +457,175 @@ contract FflonkVerifier_10 {
mstore(add(pMem, pXiSeed2), mulmod(xiSeed, xiSeed, q))
// Compute roots.S0.h0w8
- mstore(add(pMem, pH0w8_0), mulmod(mload(add(pMem, pXiSeed2)), mload(add(pMem, pXiSeed)), q))
- mstore(add(pMem, pH0w8_1), mulmod(mload(add(pMem, pH0w8_0)), w8_1, q))
- mstore(add(pMem, pH0w8_2), mulmod(mload(add(pMem, pH0w8_0)), w8_2, q))
- mstore(add(pMem, pH0w8_3), mulmod(mload(add(pMem, pH0w8_0)), w8_3, q))
- mstore(add(pMem, pH0w8_4), mulmod(mload(add(pMem, pH0w8_0)), w8_4, q))
- mstore(add(pMem, pH0w8_5), mulmod(mload(add(pMem, pH0w8_0)), w8_5, q))
- mstore(add(pMem, pH0w8_6), mulmod(mload(add(pMem, pH0w8_0)), w8_6, q))
- mstore(add(pMem, pH0w8_7), mulmod(mload(add(pMem, pH0w8_0)), w8_7, q))
+ mstore(
+ add(pMem, pH0w8_0),
+ mulmod(
+ mload(add(pMem, pXiSeed2)),
+ mload(add(pMem, pXiSeed)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH0w8_1),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_1, q)
+ )
+ mstore(
+ add(pMem, pH0w8_2),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_2, q)
+ )
+ mstore(
+ add(pMem, pH0w8_3),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_3, q)
+ )
+ mstore(
+ add(pMem, pH0w8_4),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_4, q)
+ )
+ mstore(
+ add(pMem, pH0w8_5),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_5, q)
+ )
+ mstore(
+ add(pMem, pH0w8_6),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_6, q)
+ )
+ mstore(
+ add(pMem, pH0w8_7),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_7, q)
+ )
// Compute roots.S1.h1w4
- mstore(add(pMem, pH1w4_0), mulmod(mload(add(pMem, pH0w8_0)), mload(add(pMem, pH0w8_0)), q))
- mstore(add(pMem, pH1w4_1), mulmod(mload(add(pMem, pH1w4_0)), w4, q))
- mstore(add(pMem, pH1w4_2), mulmod(mload(add(pMem, pH1w4_0)), w4_2, q))
- mstore(add(pMem, pH1w4_3), mulmod(mload(add(pMem, pH1w4_0)), w4_3, q))
+ mstore(
+ add(pMem, pH1w4_0),
+ mulmod(
+ mload(add(pMem, pH0w8_0)),
+ mload(add(pMem, pH0w8_0)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH1w4_1),
+ mulmod(mload(add(pMem, pH1w4_0)), w4, q)
+ )
+ mstore(
+ add(pMem, pH1w4_2),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_2, q)
+ )
+ mstore(
+ add(pMem, pH1w4_3),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_3, q)
+ )
// Compute roots.S2.h2w3
- mstore(add(pMem, pH2w3_0), mulmod(mload(add(pMem, pH1w4_0)), mload(add(pMem, pXiSeed2)), q))
- mstore(add(pMem, pH2w3_1), mulmod(mload(add(pMem, pH2w3_0)), w3, q))
- mstore(add(pMem, pH2w3_2), mulmod(mload(add(pMem, pH2w3_0)), w3_2, q))
+ mstore(
+ add(pMem, pH2w3_0),
+ mulmod(
+ mload(add(pMem, pH1w4_0)),
+ mload(add(pMem, pXiSeed2)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH2w3_1),
+ mulmod(mload(add(pMem, pH2w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH2w3_2),
+ mulmod(mload(add(pMem, pH2w3_0)), w3_2, q)
+ )
// Compute roots.S2.h2w3
- mstore(add(pMem, pH3w3_0), mulmod(mload(add(pMem, pH2w3_0)), wr, q))
- mstore(add(pMem, pH3w3_1), mulmod(mload(add(pMem, pH3w3_0)), w3, q))
- mstore(add(pMem, pH3w3_2), mulmod(mload(add(pMem, pH3w3_0)), w3_2, q))
-
- let xin := mulmod(mulmod(mload(add(pMem, pH2w3_0)), mload(add(pMem, pH2w3_0)), q), mload(add(pMem, pH2w3_0)), q)
+ mstore(
+ add(pMem, pH3w3_0),
+ mulmod(mload(add(pMem, pH2w3_0)), wr, q)
+ )
+ mstore(
+ add(pMem, pH3w3_1),
+ mulmod(mload(add(pMem, pH3w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH3w3_2),
+ mulmod(mload(add(pMem, pH3w3_0)), w3_2, q)
+ )
+
+ let xin := mulmod(
+ mulmod(
+ mload(add(pMem, pH2w3_0)),
+ mload(add(pMem, pH2w3_0)),
+ q
+ ),
+ mload(add(pMem, pH2w3_0)),
+ q
+ )
mstore(add(pMem, pXi), xin)
// Compute xi^n
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
-
- xin:= mod(add(sub(xin, 1), q), q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mod(add(sub(xin, 1), q), q)
mstore(add(pMem, pZh), xin)
- mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols
+ mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols
// Compute challenge.alpha
mstore(add(pMem, lastMem), xiSeed)
calldatacopy(add(pMem, 1952), pEval_ql, 480)
- mstore(add(pMem, pAlpha), mod(keccak256(add(pMem, lastMem), 512), q))
+ mstore(
+ add(pMem, pAlpha),
+ mod(keccak256(add(pMem, lastMem), 512), q)
+ )
// Compute challenge.y
mstore(add(pMem, lastMem), mload(add(pMem, pAlpha)))
- mstore(add(pMem, 1952 ), calldataload(pW1))
- mstore(add(pMem, 1984 ), calldataload(add(pW1, 32)))
+ mstore(add(pMem, 1952), calldataload(pW1))
+ mstore(add(pMem, 1984), calldataload(add(pW1, 32)))
mstore(add(pMem, pY), mod(keccak256(add(pMem, lastMem), 96), q))
}
@@ -534,49 +639,120 @@ contract FflonkVerifier_10 {
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
-
- den1 := mulmod(8, den1, q)
-
- let den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q))
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 192)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), q)
+ den1 := mulmod(8, den1, q)
- mstore(add(pMem, add(pLiS0Inv, 224)), mulmod(den1, mulmod(den2, den3, q), q))
-
+ let den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 192)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 224)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
function computeLiS1(pMem) {
@@ -585,67 +761,172 @@ contract FflonkVerifier_10 {
let den1 := 1
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
-
- den1 := mulmod(4, den1, q)
-
- let den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), q)
+ den1 := mulmod(4, den1, q)
- mstore(add(pMem, add(pLiS1Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
+ let den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
function computeLiS2(pMem) {
-
let y := mload(add(pMem, pY))
- let den1 := mulmod(mulmod(3,mload(add(pMem, pH2w3_0)),q), addmod(mload(add(pMem, pXi)) ,mod(sub(q, mulmod(mload(add(pMem, pXi)), w1 ,q)), q), q), q)
-
- let den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den1 := mulmod(mulmod(3,mload(add(pMem, pH3w3_0)),q), addmod(mulmod(mload(add(pMem, pXi)), w1 ,q),mod(sub(q, mload(add(pMem, pXi))), q), q), q)
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q))
+ let den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH2w3_0)), q),
+ addmod(
+ mload(add(pMem, pXi)),
+ mod(sub(q, mulmod(mload(add(pMem, pXi)), w1, q)), q),
+ q
+ ),
+ q
+ )
+
+ let den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH3w3_0)), q),
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mod(sub(q, mload(add(pMem, pXi))), q),
+ q
+ ),
+ q
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
// Prepare all the denominators that must be inverted, placed them in consecutive memory addresses
@@ -657,23 +938,55 @@ contract FflonkVerifier_10 {
// used in steps 10 and 11 of the verifier
let y := mload(add(pMem, pY))
let w := addmod(y, mod(sub(q, mload(add(pMem, pH1w4_0))), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q),
+ q
+ )
mstore(add(pMem, pDenH1), w)
// 1/((y - h2) (y - h2w3) (y - h2w3_2) (y - h3) (y - h3w3) (y - h3w3_2))
w := addmod(y, mod(sub(q, mload(add(pMem, pH2w3_0))), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q),
+ q
+ )
mstore(add(pMem, pDenH2), w)
// Denominator needed in the verifier when computing L_i^{S0}(X)
computeLiS0(pMem)
-
+
// Denominator needed in the verifier when computing L_i^{S1}(X)
computeLiS1(pMem)
@@ -683,27 +996,45 @@ contract FflonkVerifier_10 {
// L_i where i from 1 to num public inputs, needed in step 6 and 7 of the verifier to compute L_1(xi) and PI(xi)
w := 1
let xi := mload(add(pMem, pXi))
-
- mstore(add(pMem, pEval_l1), mulmod(n, mod(add(sub(xi, w), q), q), q))
-
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(n, mod(add(sub(xi, w), q), q), q)
+ )
// Execute Montgomery batched inversions of the previous prepared values
- inverseArray(pMem) }
+ inverseArray(pMem)
+ }
// Compute Lagrange polynomial evaluation L_i(xi)
function computeLagrange(pMem) {
let zh := mload(add(pMem, pZh))
let w := 1
-
- mstore(add(pMem, pEval_l1 ), mulmod(mload(add(pMem, pEval_l1 )), zh, q))
-
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(mload(add(pMem, pEval_l1)), zh, q)
+ )
}
// Compute public input polynomial evaluation PI(xi)
function computePi(pMem, pPub) {
let pi := 0
- pi := mod(add(sub(pi, mulmod(mload(add(pMem, pEval_l1)), calldataload(pPub), q)), q), q)
-
+ pi := mod(
+ add(
+ sub(
+ pi,
+ mulmod(
+ mload(add(pMem, pEval_l1)),
+ calldataload(pPub),
+ q
+ )
+ ),
+ q
+ ),
+ q
+ )
+
mstore(add(pMem, pPi), pi)
}
@@ -729,166 +1060,446 @@ contract FflonkVerifier_10 {
let h0w80
let c0Value
let h0w8i
-
+
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_0))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_1))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q),
+ q
+ ),
+ q
+ )
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), q), q)
-
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_2))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_3))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_4))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q),
+ q
+ ),
+ q
+ )
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), q), q)
-
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_5))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_6))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_7))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), q), q)
-
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR0), res)
}
@@ -913,10 +1524,14 @@ contract FflonkVerifier_10 {
let evalC := calldataload(pEval_c)
t0 := mulmod(calldataload(pEval_ql), evalA, q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q) ,q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q) ,q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q) ,q)
- t0 := addmod(t0, calldataload(pEval_qc) ,q)
+ t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q), q)
+ t0 := addmod(
+ t0,
+ mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q),
+ q
+ )
+ t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q), q)
+ t0 := addmod(t0, calldataload(pEval_qc), q)
t0 := addmod(t0, mload(add(pMem, pPi)), q)
t0 := mulmod(t0, mload(add(pMem, pZhInv)), q)
@@ -930,9 +1545,25 @@ contract FflonkVerifier_10 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_1))
@@ -940,9 +1571,25 @@ contract FflonkVerifier_10 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_2))
@@ -950,9 +1597,25 @@ contract FflonkVerifier_10 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_3))
@@ -960,10 +1623,25 @@ contract FflonkVerifier_10 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), q), q), q)
-
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR1), res)
}
@@ -986,79 +1664,245 @@ contract FflonkVerifier_10 {
num2 := mulmod(y, num2, q)
num2 := mulmod(y, num2, q)
num2 := mulmod(y, num2, q)
- num2 := mulmod(num2, addmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q), q)
+ num2 := mulmod(
+ num2,
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ ),
+ q
+ )
num := addmod(num, mod(sub(q, num2), q), q)
- num2 := mulmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q)
+ num2 := mulmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ )
num := addmod(num, num2, q)
let t1
let t2
- let betaXi := mulmod(mload(add(pMem, pBeta)), mload(add(pMem, pXi)), q)
+ let betaXi := mulmod(
+ mload(add(pMem, pBeta)),
+ mload(add(pMem, pXi)),
+ q
+ )
let gamma := mload(add(pMem, pGamma))
- t2 := addmod(calldataload( pEval_a), addmod(betaXi, gamma, q) ,q)
- t2 := mulmod(t2,
- addmod(calldataload( pEval_b),
- addmod(mulmod(betaXi, k1, q), gamma, q) ,q), q)
- t2 := mulmod(t2,
- addmod(calldataload( pEval_c),
- addmod(mulmod(betaXi, k2, q), gamma, q) ,q), q)
+ t2 := addmod(calldataload(pEval_a), addmod(betaXi, gamma, q), q)
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_b),
+ addmod(mulmod(betaXi, k1, q), gamma, q),
+ q
+ ),
+ q
+ )
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_c),
+ addmod(mulmod(betaXi, k2, q), gamma, q),
+ q
+ ),
+ q
+ )
t2 := mulmod(t2, calldataload(pEval_z), q)
//Let's use t1 as a temporal variable to save one local
- t1 := addmod(calldataload(pEval_a), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s1), q), gamma, q) ,q)
- t1 := mulmod(t1,
- addmod(calldataload(pEval_b), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s2), q), gamma, q) ,q), q)
- t1 := mulmod(t1,
- addmod(calldataload(pEval_c), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s3), q), gamma, q) ,q), q)
+ t1 := addmod(
+ calldataload(pEval_a),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s1),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_b),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s2),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_c),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s3),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
t1 := mulmod(t1, calldataload(pEval_zw), q)
- t2:= addmod(t2, mod(sub(q, t1), q), q)
+ t2 := addmod(t2, mod(sub(q, t1), q), q)
t2 := mulmod(t2, mload(add(pMem, pZhInv)), q)
// Compute T1(xi)
t1 := sub(calldataload(pEval_z), 1)
- t1 := mulmod(t1, mload(add(pMem, pEval_l1)) ,q)
- t1 := mulmod(t1, mload(add(pMem, pZhInv)) ,q)
+ t1 := mulmod(t1, mload(add(pMem, pEval_l1)), q)
+ t1 := mulmod(t1, mload(add(pMem, pZhInv)), q)
// Let's use local variable gamma to save the result
- gamma:=0
-
+ gamma := 0
+
let hw
- let c2Value
+ let c2Value
hw := mload(add(pMem, pH2w3_0))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH2w3_1))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH2w3_2))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_0))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_1))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(4, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_2))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(5, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR2), gamma)
}
@@ -1134,18 +1978,62 @@ contract FflonkVerifier_10 {
function computeFEJ(pMem) {
// Prepare shared numerator between F, E and J to reuse it
let y := mload(add(pMem, pY))
- let numerator := addmod(y, mod(sub(q, mload(add(pMem, pH0w8_0))), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), q)
+ let numerator := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, pH0w8_0))), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q),
+ q
+ )
// Prepare shared quotient between F and E to reuse it
- let quotient1 := mulmod(mload(add(pMem, pAlpha)), mulmod(numerator, mload(add(pMem, pDenH1)), q), q)
- let quotient2 := mulmod(mulmod(mload(add(pMem, pAlpha)), mload(add(pMem, pAlpha)), q), mulmod(numerator, mload(add(pMem, pDenH2)), q), q)
+ let quotient1 := mulmod(
+ mload(add(pMem, pAlpha)),
+ mulmod(numerator, mload(add(pMem, pDenH1)), q),
+ q
+ )
+ let quotient2 := mulmod(
+ mulmod(
+ mload(add(pMem, pAlpha)),
+ mload(add(pMem, pAlpha)),
+ q
+ ),
+ mulmod(numerator, mload(add(pMem, pDenH2)), q),
+ q
+ )
// Compute full batched polynomial commitment [F]_1
mstore(add(pMem, pF), C0x)
@@ -1154,7 +2042,20 @@ contract FflonkVerifier_10 {
g1_mulAcc(add(pMem, pF), pC2, quotient2)
// Compute group-encoded batch evaluation [E]_1
- g1_mulAccC(add(pMem, pE), G1x, G1y, addmod(mload(add(pMem, pR0)), addmod(mulmod(quotient1, mload(add(pMem, pR1)),q), mulmod(quotient2, mload(add(pMem, pR2)),q), q), q))
+ g1_mulAccC(
+ add(pMem, pE),
+ G1x,
+ G1y,
+ addmod(
+ mload(add(pMem, pR0)),
+ addmod(
+ mulmod(quotient1, mload(add(pMem, pR1)), q),
+ mulmod(quotient2, mload(add(pMem, pR2)), q),
+ q
+ ),
+ q
+ )
+ )
// Compute the full difference [J]_1
g1_mulAcc(add(pMem, pJ), pW1, numerator)
@@ -1166,9 +2067,15 @@ contract FflonkVerifier_10 {
// First pairing value
// Compute -E
- mstore(add(add(pMem, pE), 32), mod(sub(qf, mload(add(add(pMem, pE), 32))), qf))
+ mstore(
+ add(add(pMem, pE), 32),
+ mod(sub(qf, mload(add(add(pMem, pE), 32))), qf)
+ )
// Compute -J
- mstore(add(add(pMem, pJ), 32), mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf))
+ mstore(
+ add(add(pMem, pJ), 32),
+ mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf)
+ )
// F = F - E - J + y·W2
g1_acc(add(pMem, pF), add(pMem, pE))
g1_acc(add(pMem, pF), add(pMem, pJ))
@@ -1196,7 +2103,14 @@ contract FflonkVerifier_10 {
mstore(add(mIn, 320), X2y2)
mstore(add(mIn, 352), X2y1)
- let success := staticcall(sub(gas(), 2000), 8, mIn, 384, mIn, 0x20)
+ let success := staticcall(
+ sub(gas(), 2000),
+ 8,
+ mIn,
+ 384,
+ mIn,
+ 0x20
+ )
isOk := and(success, mload(mIn))
}
diff --git a/contracts/verifiers/FflonkVerifier_11.sol b/contracts/verifiers/FflonkVerifier_11.sol
index 1b5e8d0c7..d38c93f18 100644
--- a/contracts/verifiers/FflonkVerifier_11.sol
+++ b/contracts/verifiers/FflonkVerifier_11.sol
@@ -21,91 +21,117 @@
pragma solidity >=0.7.0 <0.9.0;
contract FflonkVerifier_11 {
- uint32 constant n = 16777216; // Domain size
+ uint32 constant n = 16777216; // Domain size
// Verification Key data
- uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H
- uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H
+ uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H
+ uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H
// OMEGAS
// Omega, Omega^{1/3}
- uint256 constant w1 = 5709868443893258075976348696661355716898495876243883251619397131511003808859;
- uint256 constant wr = 18200100796661656210024324131237448517259556535315737226009542456080026430510;
+ uint256 constant w1 =
+ 5709868443893258075976348696661355716898495876243883251619397131511003808859;
+ uint256 constant wr =
+ 18200100796661656210024324131237448517259556535315737226009542456080026430510;
// Omega_3, Omega_3^2
- uint256 constant w3 = 21888242871839275217838484774961031246154997185409878258781734729429964517155;
- uint256 constant w3_2 = 4407920970296243842393367215006156084916469457145843978461;
+ uint256 constant w3 =
+ 21888242871839275217838484774961031246154997185409878258781734729429964517155;
+ uint256 constant w3_2 =
+ 4407920970296243842393367215006156084916469457145843978461;
// Omega_4, Omega_4^2, Omega_4^3
- uint256 constant w4 = 21888242871839275217838484774961031246007050428528088939761107053157389710902;
- uint256 constant w4_2 = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
- uint256 constant w4_3 = 4407920970296243842541313971887945403937097133418418784715;
+ uint256 constant w4 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w4_2 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w4_3 =
+ 4407920970296243842541313971887945403937097133418418784715;
// Omega_8, Omega_8^2, Omega_8^3, Omega_8^4, Omega_8^5, Omega_8^6, Omega_8^7
- uint256 constant w8_1 = 19540430494807482326159819597004422086093766032135589407132600596362845576832;
- uint256 constant w8_2 = 21888242871839275217838484774961031246007050428528088939761107053157389710902;
- uint256 constant w8_3 = 13274704216607947843011480449124596415239537050559949017414504948711435969894;
- uint256 constant w8_4 = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
- uint256 constant w8_5 = 2347812377031792896086586148252853002454598368280444936565603590212962918785;
- uint256 constant w8_6 = 4407920970296243842541313971887945403937097133418418784715;
- uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723;
+ uint256 constant w8_1 =
+ 19540430494807482326159819597004422086093766032135589407132600596362845576832;
+ uint256 constant w8_2 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w8_3 =
+ 13274704216607947843011480449124596415239537050559949017414504948711435969894;
+ uint256 constant w8_4 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w8_5 =
+ 2347812377031792896086586148252853002454598368280444936565603590212962918785;
+ uint256 constant w8_6 =
+ 4407920970296243842541313971887945403937097133418418784715;
+ uint256 constant w8_7 =
+ 8613538655231327379234925296132678673308827349856085326283699237864372525723;
// Verifier preprocessed input C_0(x)·[1]_1
- uint256 constant C0x = 5025437015266224703663153706990323429998172899911094409768560315505934222779;
- uint256 constant C0y = 16237221832599777269427415426993243095357146403844115525422788241385670511064;
+ uint256 constant C0x =
+ 5025437015266224703663153706990323429998172899911094409768560315505934222779;
+ uint256 constant C0y =
+ 16237221832599777269427415426993243095357146403844115525422788241385670511064;
// Verifier preprocessed input x·[1]_2
- uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822;
- uint256 constant X2x2 = 17231025384763736816414546592865244497437017442647097510447326538965263639101;
- uint256 constant X2y1 = 2388026358213174446665280700919698872609886601280537296205114254867301080648;
- uint256 constant X2y2 = 11507326595632554467052522095592665270651932854513688777769618397986436103170;
+ uint256 constant X2x1 =
+ 21831381940315734285607113342023901060522397560371972897001948545212302161822;
+ uint256 constant X2x2 =
+ 17231025384763736816414546592865244497437017442647097510447326538965263639101;
+ uint256 constant X2y1 =
+ 2388026358213174446665280700919698872609886601280537296205114254867301080648;
+ uint256 constant X2y2 =
+ 11507326595632554467052522095592665270651932854513688777769618397986436103170;
// Scalar field size
- uint256 constant q = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+ uint256 constant q =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
// Base field size
- uint256 constant qf = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+ uint256 constant qf =
+ 21888242871839275222246405745257275088696311157297823662689037894645226208583;
// [1]_1
- uint256 constant G1x = 1;
- uint256 constant G1y = 2;
+ uint256 constant G1x = 1;
+ uint256 constant G1y = 2;
// [1]_2
- uint256 constant G2x1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
- uint256 constant G2x2 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
- uint256 constant G2y1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
- uint256 constant G2y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
+ uint256 constant G2x1 =
+ 10857046999023057135944570762232829481370756359578518086990519993285655852781;
+ uint256 constant G2x2 =
+ 11559732032986387107991004021392285783925812861821192530917403151452391805634;
+ uint256 constant G2y1 =
+ 8495653923123431417604973247489272438418190587263600148770280649306958101930;
+ uint256 constant G2y2 =
+ 4082367875863433681332203403145435568316851327593401208105741076214120093531;
// Proof calldata
// Byte offset of every parameter of the calldata
// Polynomial commitments
- uint16 constant pC1 = 4 + 0; // [C1]_1
- uint16 constant pC2 = 4 + 32*2; // [C2]_1
- uint16 constant pW1 = 4 + 32*4; // [W]_1
- uint16 constant pW2 = 4 + 32*6; // [W']_1
+ uint16 constant pC1 = 4 + 0; // [C1]_1
+ uint16 constant pC2 = 4 + 32 * 2; // [C2]_1
+ uint16 constant pW1 = 4 + 32 * 4; // [W]_1
+ uint16 constant pW2 = 4 + 32 * 6; // [W']_1
// Opening evaluations
- uint16 constant pEval_ql = 4 + 32*8; // q_L(xi)
- uint16 constant pEval_qr = 4 + 32*9; // q_R(xi)
- uint16 constant pEval_qm = 4 + 32*10; // q_M(xi)
- uint16 constant pEval_qo = 4 + 32*11; // q_O(xi)
- uint16 constant pEval_qc = 4 + 32*12; // q_C(xi)
- uint16 constant pEval_s1 = 4 + 32*13; // S_{sigma_1}(xi)
- uint16 constant pEval_s2 = 4 + 32*14; // S_{sigma_2}(xi)
- uint16 constant pEval_s3 = 4 + 32*15; // S_{sigma_3}(xi)
- uint16 constant pEval_a = 4 + 32*16; // a(xi)
- uint16 constant pEval_b = 4 + 32*17; // b(xi)
- uint16 constant pEval_c = 4 + 32*18; // c(xi)
- uint16 constant pEval_z = 4 + 32*19; // z(xi)
- uint16 constant pEval_zw = 4 + 32*20; // z_omega(xi)
- uint16 constant pEval_t1w = 4 + 32*21; // T_1(xi omega)
- uint16 constant pEval_t2w = 4 + 32*22; // T_2(xi omega)
- uint16 constant pEval_inv = 4 + 32*23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas,
- // we check the correctness of the inv(batch) by computing batch
- // and checking inv(batch) * batch == 1
+ uint16 constant pEval_ql = 4 + 32 * 8; // q_L(xi)
+ uint16 constant pEval_qr = 4 + 32 * 9; // q_R(xi)
+ uint16 constant pEval_qm = 4 + 32 * 10; // q_M(xi)
+ uint16 constant pEval_qo = 4 + 32 * 11; // q_O(xi)
+ uint16 constant pEval_qc = 4 + 32 * 12; // q_C(xi)
+ uint16 constant pEval_s1 = 4 + 32 * 13; // S_{sigma_1}(xi)
+ uint16 constant pEval_s2 = 4 + 32 * 14; // S_{sigma_2}(xi)
+ uint16 constant pEval_s3 = 4 + 32 * 15; // S_{sigma_3}(xi)
+ uint16 constant pEval_a = 4 + 32 * 16; // a(xi)
+ uint16 constant pEval_b = 4 + 32 * 17; // b(xi)
+ uint16 constant pEval_c = 4 + 32 * 18; // c(xi)
+ uint16 constant pEval_z = 4 + 32 * 19; // z(xi)
+ uint16 constant pEval_zw = 4 + 32 * 20; // z_omega(xi)
+ uint16 constant pEval_t1w = 4 + 32 * 21; // T_1(xi omega)
+ uint16 constant pEval_t2w = 4 + 32 * 22; // T_2(xi omega)
+ uint16 constant pEval_inv = 4 + 32 * 23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas,
+ // we check the correctness of the inv(batch) by computing batch
+ // and checking inv(batch) * batch == 1
// Memory data
// Challenges
- uint16 constant pAlpha = 0; // alpha challenge
- uint16 constant pBeta = 32; // beta challenge
- uint16 constant pGamma = 64; // gamma challenge
- uint16 constant pY = 96; // y challenge
- uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24
+ uint16 constant pAlpha = 0; // alpha challenge
+ uint16 constant pBeta = 32; // beta challenge
+ uint16 constant pGamma = 64; // gamma challenge
+ uint16 constant pY = 96; // y challenge
+ uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24
uint16 constant pXiSeed2 = 160; // (xi seed)^2
- uint16 constant pXi = 192; // xi challenge
+ uint16 constant pXi = 192; // xi challenge
// Roots
// S_0 = roots_8(xi) = { h_0, h_0w_8, h_0w_8^2, h_0w_8^3, h_0w_8^4, h_0w_8^5, h_0w_8^6, h_0w_8^7 }
@@ -134,40 +160,40 @@ contract FflonkVerifier_11 {
uint16 constant pH3w3_1 = 736;
uint16 constant pH3w3_2 = 768;
- uint16 constant pPi = 800; // PI(xi)
- uint16 constant pR0 = 832; // r0(y)
- uint16 constant pR1 = 864; // r1(y)
- uint16 constant pR2 = 896; // r2(y)
+ uint16 constant pPi = 800; // PI(xi)
+ uint16 constant pR0 = 832; // r0(y)
+ uint16 constant pR1 = 864; // r1(y)
+ uint16 constant pR2 = 896; // r2(y)
- uint16 constant pF = 928; // [F]_1, 64 bytes
- uint16 constant pE = 992; // [E]_1, 64 bytes
- uint16 constant pJ = 1056; // [J]_1, 64 bytes
+ uint16 constant pF = 928; // [F]_1, 64 bytes
+ uint16 constant pE = 992; // [E]_1, 64 bytes
+ uint16 constant pJ = 1056; // [J]_1, 64 bytes
- uint16 constant pZh = 1184; // Z_H(xi)
+ uint16 constant pZh = 1184; // Z_H(xi)
// From this point we write all the variables that must be computed using the Montgomery batch inversion
- uint16 constant pZhInv = 1216; // 1/Z_H(xi)
- uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) )
- uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) )
+ uint16 constant pZhInv = 1216; // 1/Z_H(xi)
+ uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) )
+ uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) )
uint16 constant pLiS0Inv = 1312; // Reserve 8 * 32 bytes to compute r_0(X)
uint16 constant pLiS1Inv = 1568; // Reserve 4 * 32 bytes to compute r_1(X)
uint16 constant pLiS2Inv = 1696; // Reserve 6 * 32 bytes to compute r_2(X)
// Lagrange evaluations
-
+
uint16 constant pEval_l1 = 1888;
-
-
+
uint16 constant lastMem = 1920;
-
- function verifyProof(bytes32[24] calldata proof, uint256[1] calldata pubSignals) public view returns (bool) {
+ function verifyProof(
+ bytes32[24] calldata proof,
+ uint256[1] calldata pubSignals
+ ) public view returns (bool) {
assembly {
// Computes the inverse of an array of values
// See https://vitalik.ca/general/2018/07/21/starks_part_3.html in section where explain fields operations
// To save the inverse to be computed on chain the prover sends the inverse as an evaluation in commits.eval_inv
function inverseArray(pMem) {
-
- let pAux := mload(0x40) // Point to the next free position
- let acc := mload(add(pMem,pZhInv)) // Read the first element
+ let pAux := mload(0x40) // Point to the next free position
+ let acc := mload(add(pMem, pZhInv)) // Read the first element
mstore(pAux, acc)
pAux := add(pAux, 32)
@@ -254,13 +280,12 @@ contract FflonkVerifier_11 {
acc := mulmod(acc, mload(add(pMem, pEval_l1)), q)
mstore(pAux, acc)
-
let inv := calldataload(pEval_inv)
// Before using the inverse sent by the prover the verifier checks inv(batch) * batch === 1
if iszero(eq(1, mulmod(acc, inv, q))) {
mstore(0, 0)
- return(0,0x20)
+ return(0, 0x20)
}
acc := inv
@@ -373,8 +398,8 @@ contract FflonkVerifier_11 {
mstore(0, 0)
return(0, 0x20)
}
- }
-
+ }
+
// Validate all the evaluations sent by the prover ∈ F
function checkInput() {
// Check proof commitments fullfill bn128 curve equation Y^2 = X^3 + 3
@@ -405,18 +430,22 @@ contract FflonkVerifier_11 {
function computeChallenges(pMem, pPublic) {
// Compute challenge.beta & challenge.gamma
- mstore(add(pMem, 1920 ), C0x)
- mstore(add(pMem, 1952 ), C0y)
+ mstore(add(pMem, 1920), C0x)
+ mstore(add(pMem, 1952), C0y)
mstore(add(pMem, 1984), calldataload(pPublic))
-
-
- mstore(add(pMem, 2016 ), calldataload(pC1))
- mstore(add(pMem, 2048 ), calldataload(add(pC1, 32)))
+ mstore(add(pMem, 2016), calldataload(pC1))
+ mstore(add(pMem, 2048), calldataload(add(pC1, 32)))
- mstore(add(pMem, pBeta), mod(keccak256(add(pMem, lastMem), 160), q))
- mstore(add(pMem, pGamma), mod(keccak256(add(pMem, pBeta), 32), q))
+ mstore(
+ add(pMem, pBeta),
+ mod(keccak256(add(pMem, lastMem), 160), q)
+ )
+ mstore(
+ add(pMem, pGamma),
+ mod(keccak256(add(pMem, pBeta), 32), q)
+ )
// Get xiSeed & xiSeed2
mstore(add(pMem, lastMem), mload(add(pMem, pGamma)))
@@ -428,99 +457,175 @@ contract FflonkVerifier_11 {
mstore(add(pMem, pXiSeed2), mulmod(xiSeed, xiSeed, q))
// Compute roots.S0.h0w8
- mstore(add(pMem, pH0w8_0), mulmod(mload(add(pMem, pXiSeed2)), mload(add(pMem, pXiSeed)), q))
- mstore(add(pMem, pH0w8_1), mulmod(mload(add(pMem, pH0w8_0)), w8_1, q))
- mstore(add(pMem, pH0w8_2), mulmod(mload(add(pMem, pH0w8_0)), w8_2, q))
- mstore(add(pMem, pH0w8_3), mulmod(mload(add(pMem, pH0w8_0)), w8_3, q))
- mstore(add(pMem, pH0w8_4), mulmod(mload(add(pMem, pH0w8_0)), w8_4, q))
- mstore(add(pMem, pH0w8_5), mulmod(mload(add(pMem, pH0w8_0)), w8_5, q))
- mstore(add(pMem, pH0w8_6), mulmod(mload(add(pMem, pH0w8_0)), w8_6, q))
- mstore(add(pMem, pH0w8_7), mulmod(mload(add(pMem, pH0w8_0)), w8_7, q))
+ mstore(
+ add(pMem, pH0w8_0),
+ mulmod(
+ mload(add(pMem, pXiSeed2)),
+ mload(add(pMem, pXiSeed)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH0w8_1),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_1, q)
+ )
+ mstore(
+ add(pMem, pH0w8_2),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_2, q)
+ )
+ mstore(
+ add(pMem, pH0w8_3),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_3, q)
+ )
+ mstore(
+ add(pMem, pH0w8_4),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_4, q)
+ )
+ mstore(
+ add(pMem, pH0w8_5),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_5, q)
+ )
+ mstore(
+ add(pMem, pH0w8_6),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_6, q)
+ )
+ mstore(
+ add(pMem, pH0w8_7),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_7, q)
+ )
// Compute roots.S1.h1w4
- mstore(add(pMem, pH1w4_0), mulmod(mload(add(pMem, pH0w8_0)), mload(add(pMem, pH0w8_0)), q))
- mstore(add(pMem, pH1w4_1), mulmod(mload(add(pMem, pH1w4_0)), w4, q))
- mstore(add(pMem, pH1w4_2), mulmod(mload(add(pMem, pH1w4_0)), w4_2, q))
- mstore(add(pMem, pH1w4_3), mulmod(mload(add(pMem, pH1w4_0)), w4_3, q))
+ mstore(
+ add(pMem, pH1w4_0),
+ mulmod(
+ mload(add(pMem, pH0w8_0)),
+ mload(add(pMem, pH0w8_0)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH1w4_1),
+ mulmod(mload(add(pMem, pH1w4_0)), w4, q)
+ )
+ mstore(
+ add(pMem, pH1w4_2),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_2, q)
+ )
+ mstore(
+ add(pMem, pH1w4_3),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_3, q)
+ )
// Compute roots.S2.h2w3
- mstore(add(pMem, pH2w3_0), mulmod(mload(add(pMem, pH1w4_0)), mload(add(pMem, pXiSeed2)), q))
- mstore(add(pMem, pH2w3_1), mulmod(mload(add(pMem, pH2w3_0)), w3, q))
- mstore(add(pMem, pH2w3_2), mulmod(mload(add(pMem, pH2w3_0)), w3_2, q))
+ mstore(
+ add(pMem, pH2w3_0),
+ mulmod(
+ mload(add(pMem, pH1w4_0)),
+ mload(add(pMem, pXiSeed2)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH2w3_1),
+ mulmod(mload(add(pMem, pH2w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH2w3_2),
+ mulmod(mload(add(pMem, pH2w3_0)), w3_2, q)
+ )
// Compute roots.S2.h2w3
- mstore(add(pMem, pH3w3_0), mulmod(mload(add(pMem, pH2w3_0)), wr, q))
- mstore(add(pMem, pH3w3_1), mulmod(mload(add(pMem, pH3w3_0)), w3, q))
- mstore(add(pMem, pH3w3_2), mulmod(mload(add(pMem, pH3w3_0)), w3_2, q))
-
- let xin := mulmod(mulmod(mload(add(pMem, pH2w3_0)), mload(add(pMem, pH2w3_0)), q), mload(add(pMem, pH2w3_0)), q)
+ mstore(
+ add(pMem, pH3w3_0),
+ mulmod(mload(add(pMem, pH2w3_0)), wr, q)
+ )
+ mstore(
+ add(pMem, pH3w3_1),
+ mulmod(mload(add(pMem, pH3w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH3w3_2),
+ mulmod(mload(add(pMem, pH3w3_0)), w3_2, q)
+ )
+
+ let xin := mulmod(
+ mulmod(
+ mload(add(pMem, pH2w3_0)),
+ mload(add(pMem, pH2w3_0)),
+ q
+ ),
+ mload(add(pMem, pH2w3_0)),
+ q
+ )
mstore(add(pMem, pXi), xin)
// Compute xi^n
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
- xin:= mulmod(xin, xin, q)
-
-
- xin:= mod(add(sub(xin, 1), q), q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mod(add(sub(xin, 1), q), q)
mstore(add(pMem, pZh), xin)
- mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols
+ mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols
// Compute challenge.alpha
mstore(add(pMem, lastMem), xiSeed)
calldatacopy(add(pMem, 1952), pEval_ql, 480)
- mstore(add(pMem, pAlpha), mod(keccak256(add(pMem, lastMem), 512), q))
+ mstore(
+ add(pMem, pAlpha),
+ mod(keccak256(add(pMem, lastMem), 512), q)
+ )
// Compute challenge.y
mstore(add(pMem, lastMem), mload(add(pMem, pAlpha)))
- mstore(add(pMem, 1952 ), calldataload(pW1))
- mstore(add(pMem, 1984 ), calldataload(add(pW1, 32)))
+ mstore(add(pMem, 1952), calldataload(pW1))
+ mstore(add(pMem, 1984), calldataload(add(pW1, 32)))
mstore(add(pMem, pY), mod(keccak256(add(pMem, lastMem), 96), q))
}
@@ -534,49 +639,120 @@ contract FflonkVerifier_11 {
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
-
- den1 := mulmod(8, den1, q)
-
- let den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q))
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS0Inv, 192)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q), q)
+ den1 := mulmod(8, den1, q)
- mstore(add(pMem, add(pLiS0Inv, 224)), mulmod(den1, mulmod(den2, den3, q), q))
-
+ let den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 192)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 224)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
function computeLiS1(pMem) {
@@ -585,67 +761,172 @@ contract FflonkVerifier_11 {
let den1 := 1
den1 := mulmod(den1, root0, q)
den1 := mulmod(den1, root0, q)
-
- den1 := mulmod(4, den1, q)
-
- let den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS1Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q), q)
+ den1 := mulmod(4, den1, q)
- mstore(add(pMem, add(pLiS1Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
+ let den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
function computeLiS2(pMem) {
-
let y := mload(add(pMem, pY))
- let den1 := mulmod(mulmod(3,mload(add(pMem, pH2w3_0)),q), addmod(mload(add(pMem, pXi)) ,mod(sub(q, mulmod(mload(add(pMem, pXi)), w1 ,q)), q), q), q)
-
- let den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32))))
- let den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 0)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 32)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 64)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den1 := mulmod(mulmod(3,mload(add(pMem, pH3w3_0)),q), addmod(mulmod(mload(add(pMem, pXi)), w1 ,q),mod(sub(q, mload(add(pMem, pXi))), q), q), q)
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 96)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 128)), mulmod(den1, mulmod(den2, den3, q), q))
-
- den2 := mload(add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32))))
- den3 := addmod(y, mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q), q)
-
- mstore(add(pMem, add(pLiS2Inv, 160)), mulmod(den1, mulmod(den2, den3, q), q))
+ let den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH2w3_0)), q),
+ addmod(
+ mload(add(pMem, pXi)),
+ mod(sub(q, mulmod(mload(add(pMem, pXi)), w1, q)), q),
+ q
+ ),
+ q
+ )
+
+ let den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH3w3_0)), q),
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mod(sub(q, mload(add(pMem, pXi))), q),
+ q
+ ),
+ q
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
}
// Prepare all the denominators that must be inverted, placed them in consecutive memory addresses
@@ -657,23 +938,55 @@ contract FflonkVerifier_11 {
// used in steps 10 and 11 of the verifier
let y := mload(add(pMem, pY))
let w := addmod(y, mod(sub(q, mload(add(pMem, pH1w4_0))), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q),
+ q
+ )
mstore(add(pMem, pDenH1), w)
// 1/((y - h2) (y - h2w3) (y - h2w3_2) (y - h3) (y - h3w3) (y - h3w3_2))
w := addmod(y, mod(sub(q, mload(add(pMem, pH2w3_0))), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q), q)
- w := mulmod(w, addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q),
+ q
+ )
mstore(add(pMem, pDenH2), w)
// Denominator needed in the verifier when computing L_i^{S0}(X)
computeLiS0(pMem)
-
+
// Denominator needed in the verifier when computing L_i^{S1}(X)
computeLiS1(pMem)
@@ -683,27 +996,45 @@ contract FflonkVerifier_11 {
// L_i where i from 1 to num public inputs, needed in step 6 and 7 of the verifier to compute L_1(xi) and PI(xi)
w := 1
let xi := mload(add(pMem, pXi))
-
- mstore(add(pMem, pEval_l1), mulmod(n, mod(add(sub(xi, w), q), q), q))
-
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(n, mod(add(sub(xi, w), q), q), q)
+ )
// Execute Montgomery batched inversions of the previous prepared values
- inverseArray(pMem) }
+ inverseArray(pMem)
+ }
// Compute Lagrange polynomial evaluation L_i(xi)
function computeLagrange(pMem) {
let zh := mload(add(pMem, pZh))
let w := 1
-
- mstore(add(pMem, pEval_l1 ), mulmod(mload(add(pMem, pEval_l1 )), zh, q))
-
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(mload(add(pMem, pEval_l1)), zh, q)
+ )
}
// Compute public input polynomial evaluation PI(xi)
function computePi(pMem, pPub) {
let pi := 0
- pi := mod(add(sub(pi, mulmod(mload(add(pMem, pEval_l1)), calldataload(pPub), q)), q), q)
-
+ pi := mod(
+ add(
+ sub(
+ pi,
+ mulmod(
+ mload(add(pMem, pEval_l1)),
+ calldataload(pPub),
+ q
+ )
+ ),
+ q
+ ),
+ q
+ )
+
mstore(add(pMem, pPi), pi)
}
@@ -729,166 +1060,446 @@ contract FflonkVerifier_11 {
let h0w80
let c0Value
let h0w8i
-
+
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_0))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_1))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q),
+ q
+ ),
+ q
+ )
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q), q), q)
-
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_2))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_3))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_4))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q),
+ q
+ ),
+ q
+ )
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q), q), q)
-
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_5))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_6))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q), q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q),
+ q
+ ),
+ q
+ )
-
// Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
// + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
h0w80 := mload(add(pMem, pH0w8_7))
- c0Value := addmod(calldataload(pEval_ql), mulmod(calldataload(pEval_qr), h0w80, q), q)
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
h0w8i := mulmod(h0w80, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qo), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qm), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_qc), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s1), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s2), h0w8i, q), q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
h0w8i := mulmod(h0w8i, h0w80, q)
- c0Value := addmod(c0Value, mulmod(calldataload(pEval_s3), h0w8i, q), q)
-
- res := addmod(res, mulmod(c0Value, mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q), q), q)
-
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR0), res)
}
@@ -913,10 +1524,14 @@ contract FflonkVerifier_11 {
let evalC := calldataload(pEval_c)
t0 := mulmod(calldataload(pEval_ql), evalA, q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q) ,q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q) ,q)
- t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q) ,q)
- t0 := addmod(t0, calldataload(pEval_qc) ,q)
+ t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q), q)
+ t0 := addmod(
+ t0,
+ mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q),
+ q
+ )
+ t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q), q)
+ t0 := addmod(t0, calldataload(pEval_qc), q)
t0 := addmod(t0, mload(add(pMem, pPi)), q)
t0 := mulmod(t0, mload(add(pMem, pZhInv)), q)
@@ -930,9 +1545,25 @@ contract FflonkVerifier_11 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(0, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_1))
@@ -940,9 +1571,25 @@ contract FflonkVerifier_11 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(1, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_2))
@@ -950,9 +1597,25 @@ contract FflonkVerifier_11 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(2, 32)))), q), q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
c1Value := evalA
h1w4 := mload(add(pMem, pH1w4_3))
@@ -960,10 +1623,25 @@ contract FflonkVerifier_11 {
c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
square := mulmod(h1w4, h1w4, q)
c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
- c1Value := addmod(c1Value, mulmod(mulmod(square, h1w4, q), t0, q), q)
-
- res := addmod(res, mulmod(c1Value, mulmod(num, mload(add(pMem, add(pLiS1Inv, mul(3, 32)))), q), q), q)
-
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR1), res)
}
@@ -986,79 +1664,245 @@ contract FflonkVerifier_11 {
num2 := mulmod(y, num2, q)
num2 := mulmod(y, num2, q)
num2 := mulmod(y, num2, q)
- num2 := mulmod(num2, addmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q), q)
+ num2 := mulmod(
+ num2,
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ ),
+ q
+ )
num := addmod(num, mod(sub(q, num2), q), q)
- num2 := mulmod(mulmod(mload(add(pMem, pXi)), w1 ,q), mload(add(pMem, pXi)), q)
+ num2 := mulmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ )
num := addmod(num, num2, q)
let t1
let t2
- let betaXi := mulmod(mload(add(pMem, pBeta)), mload(add(pMem, pXi)), q)
+ let betaXi := mulmod(
+ mload(add(pMem, pBeta)),
+ mload(add(pMem, pXi)),
+ q
+ )
let gamma := mload(add(pMem, pGamma))
- t2 := addmod(calldataload( pEval_a), addmod(betaXi, gamma, q) ,q)
- t2 := mulmod(t2,
- addmod(calldataload( pEval_b),
- addmod(mulmod(betaXi, k1, q), gamma, q) ,q), q)
- t2 := mulmod(t2,
- addmod(calldataload( pEval_c),
- addmod(mulmod(betaXi, k2, q), gamma, q) ,q), q)
+ t2 := addmod(calldataload(pEval_a), addmod(betaXi, gamma, q), q)
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_b),
+ addmod(mulmod(betaXi, k1, q), gamma, q),
+ q
+ ),
+ q
+ )
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_c),
+ addmod(mulmod(betaXi, k2, q), gamma, q),
+ q
+ ),
+ q
+ )
t2 := mulmod(t2, calldataload(pEval_z), q)
//Let's use t1 as a temporal variable to save one local
- t1 := addmod(calldataload(pEval_a), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s1), q), gamma, q) ,q)
- t1 := mulmod(t1,
- addmod(calldataload(pEval_b), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s2), q), gamma, q) ,q), q)
- t1 := mulmod(t1,
- addmod(calldataload(pEval_c), addmod(mulmod(mload(add(pMem, pBeta)), calldataload(pEval_s3), q), gamma, q) ,q), q)
+ t1 := addmod(
+ calldataload(pEval_a),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s1),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_b),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s2),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_c),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s3),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
t1 := mulmod(t1, calldataload(pEval_zw), q)
- t2:= addmod(t2, mod(sub(q, t1), q), q)
+ t2 := addmod(t2, mod(sub(q, t1), q), q)
t2 := mulmod(t2, mload(add(pMem, pZhInv)), q)
// Compute T1(xi)
t1 := sub(calldataload(pEval_z), 1)
- t1 := mulmod(t1, mload(add(pMem, pEval_l1)) ,q)
- t1 := mulmod(t1, mload(add(pMem, pZhInv)) ,q)
+ t1 := mulmod(t1, mload(add(pMem, pEval_l1)), q)
+ t1 := mulmod(t1, mload(add(pMem, pZhInv)), q)
// Let's use local variable gamma to save the result
- gamma:=0
-
+ gamma := 0
+
let hw
- let c2Value
+ let c2Value
hw := mload(add(pMem, pH2w3_0))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(0, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH2w3_1))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(1, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH2w3_2))
c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(2, 32)))), q), q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_0))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(3, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_1))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(4, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(4, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
hw := mload(add(pMem, pH3w3_2))
- c2Value := addmod(calldataload(pEval_zw), mulmod(hw, calldataload(pEval_t1w), q), q)
- c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q), q)
- gamma := addmod(gamma, mulmod(c2Value, mulmod(num, mload(add(pMem, add(pLiS2Inv, mul(5, 32)))), q), q), q)
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(5, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
mstore(add(pMem, pR2), gamma)
}
@@ -1134,18 +1978,62 @@ contract FflonkVerifier_11 {
function computeFEJ(pMem) {
// Prepare shared numerator between F, E and J to reuse it
let y := mload(add(pMem, pY))
- let numerator := addmod(y, mod(sub(q, mload(add(pMem, pH0w8_0))), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q), q)
- numerator := mulmod(numerator, addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q), q)
+ let numerator := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, pH0w8_0))), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q),
+ q
+ )
// Prepare shared quotient between F and E to reuse it
- let quotient1 := mulmod(mload(add(pMem, pAlpha)), mulmod(numerator, mload(add(pMem, pDenH1)), q), q)
- let quotient2 := mulmod(mulmod(mload(add(pMem, pAlpha)), mload(add(pMem, pAlpha)), q), mulmod(numerator, mload(add(pMem, pDenH2)), q), q)
+ let quotient1 := mulmod(
+ mload(add(pMem, pAlpha)),
+ mulmod(numerator, mload(add(pMem, pDenH1)), q),
+ q
+ )
+ let quotient2 := mulmod(
+ mulmod(
+ mload(add(pMem, pAlpha)),
+ mload(add(pMem, pAlpha)),
+ q
+ ),
+ mulmod(numerator, mload(add(pMem, pDenH2)), q),
+ q
+ )
// Compute full batched polynomial commitment [F]_1
mstore(add(pMem, pF), C0x)
@@ -1154,7 +2042,20 @@ contract FflonkVerifier_11 {
g1_mulAcc(add(pMem, pF), pC2, quotient2)
// Compute group-encoded batch evaluation [E]_1
- g1_mulAccC(add(pMem, pE), G1x, G1y, addmod(mload(add(pMem, pR0)), addmod(mulmod(quotient1, mload(add(pMem, pR1)),q), mulmod(quotient2, mload(add(pMem, pR2)),q), q), q))
+ g1_mulAccC(
+ add(pMem, pE),
+ G1x,
+ G1y,
+ addmod(
+ mload(add(pMem, pR0)),
+ addmod(
+ mulmod(quotient1, mload(add(pMem, pR1)), q),
+ mulmod(quotient2, mload(add(pMem, pR2)), q),
+ q
+ ),
+ q
+ )
+ )
// Compute the full difference [J]_1
g1_mulAcc(add(pMem, pJ), pW1, numerator)
@@ -1166,9 +2067,15 @@ contract FflonkVerifier_11 {
// First pairing value
// Compute -E
- mstore(add(add(pMem, pE), 32), mod(sub(qf, mload(add(add(pMem, pE), 32))), qf))
+ mstore(
+ add(add(pMem, pE), 32),
+ mod(sub(qf, mload(add(add(pMem, pE), 32))), qf)
+ )
// Compute -J
- mstore(add(add(pMem, pJ), 32), mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf))
+ mstore(
+ add(add(pMem, pJ), 32),
+ mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf)
+ )
// F = F - E - J + y·W2
g1_acc(add(pMem, pF), add(pMem, pE))
g1_acc(add(pMem, pF), add(pMem, pJ))
@@ -1196,7 +2103,14 @@ contract FflonkVerifier_11 {
mstore(add(mIn, 320), X2y2)
mstore(add(mIn, 352), X2y1)
- let success := staticcall(sub(gas(), 2000), 8, mIn, 384, mIn, 0x20)
+ let success := staticcall(
+ sub(gas(), 2000),
+ 8,
+ mIn,
+ 384,
+ mIn,
+ 0x20
+ )
isOk := and(success, mload(mIn))
}
diff --git a/contracts/verifiers/FflonkVerifier_12.sol b/contracts/verifiers/FflonkVerifier_12.sol
new file mode 100644
index 000000000..a167dff23
--- /dev/null
+++ b/contracts/verifiers/FflonkVerifier_12.sol
@@ -0,0 +1,2158 @@
+// SPDX-License-Identifier: GPL-3.0
+/*
+ Copyright 2021 0KIMS association.
+
+ This file is generated with [snarkJS](https://github.com/iden3/snarkjs).
+
+ snarkJS is a free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ snarkJS 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 General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with snarkJS. If not, see .
+*/
+
+pragma solidity >=0.7.0 <0.9.0;
+
+contract FflonkVerifier_12 {
+ uint32 constant n = 16777216; // Domain size
+
+ // Verification Key data
+ uint256 constant k1 = 2; // Plonk k1 multiplicative factor to force distinct cosets of H
+ uint256 constant k2 = 3; // Plonk k2 multiplicative factor to force distinct cosets of H
+
+ // OMEGAS
+ // Omega, Omega^{1/3}
+ uint256 constant w1 =
+ 5709868443893258075976348696661355716898495876243883251619397131511003808859;
+ uint256 constant wr =
+ 18200100796661656210024324131237448517259556535315737226009542456080026430510;
+ // Omega_3, Omega_3^2
+ uint256 constant w3 =
+ 21888242871839275217838484774961031246154997185409878258781734729429964517155;
+ uint256 constant w3_2 =
+ 4407920970296243842393367215006156084916469457145843978461;
+ // Omega_4, Omega_4^2, Omega_4^3
+ uint256 constant w4 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w4_2 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w4_3 =
+ 4407920970296243842541313971887945403937097133418418784715;
+ // Omega_8, Omega_8^2, Omega_8^3, Omega_8^4, Omega_8^5, Omega_8^6, Omega_8^7
+ uint256 constant w8_1 =
+ 19540430494807482326159819597004422086093766032135589407132600596362845576832;
+ uint256 constant w8_2 =
+ 21888242871839275217838484774961031246007050428528088939761107053157389710902;
+ uint256 constant w8_3 =
+ 13274704216607947843011480449124596415239537050559949017414504948711435969894;
+ uint256 constant w8_4 =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 constant w8_5 =
+ 2347812377031792896086586148252853002454598368280444936565603590212962918785;
+ uint256 constant w8_6 =
+ 4407920970296243842541313971887945403937097133418418784715;
+ uint256 constant w8_7 =
+ 8613538655231327379234925296132678673308827349856085326283699237864372525723;
+
+ // Verifier preprocessed input C_0(x)·[1]_1
+ uint256 constant C0x =
+ 14108481345212921148996352149587402371241828412155926312706521103747833870705;
+ uint256 constant C0y =
+ 5431364720504262011685673568202437040741271312846880378221091213893853645141;
+
+ // Verifier preprocessed input x·[1]_2
+ uint256 constant X2x1 =
+ 21831381940315734285607113342023901060522397560371972897001948545212302161822;
+ uint256 constant X2x2 =
+ 17231025384763736816414546592865244497437017442647097510447326538965263639101;
+ uint256 constant X2y1 =
+ 2388026358213174446665280700919698872609886601280537296205114254867301080648;
+ uint256 constant X2y2 =
+ 11507326595632554467052522095592665270651932854513688777769618397986436103170;
+
+ // Scalar field size
+ uint256 constant q =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+ // Base field size
+ uint256 constant qf =
+ 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+ // [1]_1
+ uint256 constant G1x = 1;
+ uint256 constant G1y = 2;
+ // [1]_2
+ uint256 constant G2x1 =
+ 10857046999023057135944570762232829481370756359578518086990519993285655852781;
+ uint256 constant G2x2 =
+ 11559732032986387107991004021392285783925812861821192530917403151452391805634;
+ uint256 constant G2y1 =
+ 8495653923123431417604973247489272438418190587263600148770280649306958101930;
+ uint256 constant G2y2 =
+ 4082367875863433681332203403145435568316851327593401208105741076214120093531;
+
+ // Proof calldata
+ // Byte offset of every parameter of the calldata
+ // Polynomial commitments
+ uint16 constant pC1 = 4 + 0; // [C1]_1
+ uint16 constant pC2 = 4 + 32 * 2; // [C2]_1
+ uint16 constant pW1 = 4 + 32 * 4; // [W]_1
+ uint16 constant pW2 = 4 + 32 * 6; // [W']_1
+ // Opening evaluations
+ uint16 constant pEval_ql = 4 + 32 * 8; // q_L(xi)
+ uint16 constant pEval_qr = 4 + 32 * 9; // q_R(xi)
+ uint16 constant pEval_qm = 4 + 32 * 10; // q_M(xi)
+ uint16 constant pEval_qo = 4 + 32 * 11; // q_O(xi)
+ uint16 constant pEval_qc = 4 + 32 * 12; // q_C(xi)
+ uint16 constant pEval_s1 = 4 + 32 * 13; // S_{sigma_1}(xi)
+ uint16 constant pEval_s2 = 4 + 32 * 14; // S_{sigma_2}(xi)
+ uint16 constant pEval_s3 = 4 + 32 * 15; // S_{sigma_3}(xi)
+ uint16 constant pEval_a = 4 + 32 * 16; // a(xi)
+ uint16 constant pEval_b = 4 + 32 * 17; // b(xi)
+ uint16 constant pEval_c = 4 + 32 * 18; // c(xi)
+ uint16 constant pEval_z = 4 + 32 * 19; // z(xi)
+ uint16 constant pEval_zw = 4 + 32 * 20; // z_omega(xi)
+ uint16 constant pEval_t1w = 4 + 32 * 21; // T_1(xi omega)
+ uint16 constant pEval_t2w = 4 + 32 * 22; // T_2(xi omega)
+ uint16 constant pEval_inv = 4 + 32 * 23; // inv(batch) sent by the prover to avoid any inverse calculation to save gas,
+ // we check the correctness of the inv(batch) by computing batch
+ // and checking inv(batch) * batch == 1
+
+ // Memory data
+ // Challenges
+ uint16 constant pAlpha = 0; // alpha challenge
+ uint16 constant pBeta = 32; // beta challenge
+ uint16 constant pGamma = 64; // gamma challenge
+ uint16 constant pY = 96; // y challenge
+ uint16 constant pXiSeed = 128; // xi seed, from this value we compute xi = xiSeed^24
+ uint16 constant pXiSeed2 = 160; // (xi seed)^2
+ uint16 constant pXi = 192; // xi challenge
+
+ // Roots
+ // S_0 = roots_8(xi) = { h_0, h_0w_8, h_0w_8^2, h_0w_8^3, h_0w_8^4, h_0w_8^5, h_0w_8^6, h_0w_8^7 }
+ uint16 constant pH0w8_0 = 224;
+ uint16 constant pH0w8_1 = 256;
+ uint16 constant pH0w8_2 = 288;
+ uint16 constant pH0w8_3 = 320;
+ uint16 constant pH0w8_4 = 352;
+ uint16 constant pH0w8_5 = 384;
+ uint16 constant pH0w8_6 = 416;
+ uint16 constant pH0w8_7 = 448;
+
+ // S_1 = roots_4(xi) = { h_1, h_1w_4, h_1w_4^2, h_1w_4^3 }
+ uint16 constant pH1w4_0 = 480;
+ uint16 constant pH1w4_1 = 512;
+ uint16 constant pH1w4_2 = 544;
+ uint16 constant pH1w4_3 = 576;
+
+ // S_2 = roots_3(xi) U roots_3(xi omega)
+ // roots_3(xi) = { h_2, h_2w_3, h_2w_3^2 }
+ uint16 constant pH2w3_0 = 608;
+ uint16 constant pH2w3_1 = 640;
+ uint16 constant pH2w3_2 = 672;
+ // roots_3(xi omega) = { h_3, h_3w_3, h_3w_3^2 }
+ uint16 constant pH3w3_0 = 704;
+ uint16 constant pH3w3_1 = 736;
+ uint16 constant pH3w3_2 = 768;
+
+ uint16 constant pPi = 800; // PI(xi)
+ uint16 constant pR0 = 832; // r0(y)
+ uint16 constant pR1 = 864; // r1(y)
+ uint16 constant pR2 = 896; // r2(y)
+
+ uint16 constant pF = 928; // [F]_1, 64 bytes
+ uint16 constant pE = 992; // [E]_1, 64 bytes
+ uint16 constant pJ = 1056; // [J]_1, 64 bytes
+
+ uint16 constant pZh = 1184; // Z_H(xi)
+ // From this point we write all the variables that must be computed using the Montgomery batch inversion
+ uint16 constant pZhInv = 1216; // 1/Z_H(xi)
+ uint16 constant pDenH1 = 1248; // 1/( (y-h_1w_4) (y-h_1w_4^2) (y-h_1w_4^3) (y-h_1w_4^4) )
+ uint16 constant pDenH2 = 1280; // 1/( (y-h_2w_3) (y-h_2w_3^2) (y-h_2w_3^3) (y-h_3w_3) (y-h_3w_3^2) (y-h_3w_3^3) )
+ uint16 constant pLiS0Inv = 1312; // Reserve 8 * 32 bytes to compute r_0(X)
+ uint16 constant pLiS1Inv = 1568; // Reserve 4 * 32 bytes to compute r_1(X)
+ uint16 constant pLiS2Inv = 1696; // Reserve 6 * 32 bytes to compute r_2(X)
+ // Lagrange evaluations
+
+ uint16 constant pEval_l1 = 1888;
+
+ uint16 constant lastMem = 1920;
+
+ function verifyProof(
+ bytes32[24] calldata proof,
+ uint256[1] calldata pubSignals
+ ) public view returns (bool) {
+ assembly {
+ // Computes the inverse of an array of values
+ // See https://vitalik.ca/general/2018/07/21/starks_part_3.html in section where explain fields operations
+ // To save the inverse to be computed on chain the prover sends the inverse as an evaluation in commits.eval_inv
+ function inverseArray(pMem) {
+ let pAux := mload(0x40) // Point to the next free position
+ let acc := mload(add(pMem, pZhInv)) // Read the first element
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pDenH1)), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pDenH2)), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pLiS0Inv)), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 32))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 64))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 96))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 128))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 160))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 192))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 224))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pLiS1Inv)), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 32))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 64))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 96))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pLiS2Inv)), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 32))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 64))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 96))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 128))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 160))), q)
+ mstore(pAux, acc)
+
+ pAux := add(pAux, 32)
+ acc := mulmod(acc, mload(add(pMem, pEval_l1)), q)
+ mstore(pAux, acc)
+
+ let inv := calldataload(pEval_inv)
+
+ // Before using the inverse sent by the prover the verifier checks inv(batch) * batch === 1
+ if iszero(eq(1, mulmod(acc, inv, q))) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+
+ acc := inv
+
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pEval_l1)), q)
+ mstore(add(pMem, pEval_l1), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 160))), q)
+ mstore(add(pMem, add(pLiS2Inv, 160)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 128))), q)
+ mstore(add(pMem, add(pLiS2Inv, 128)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 96))), q)
+ mstore(add(pMem, add(pLiS2Inv, 96)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 64))), q)
+ mstore(add(pMem, add(pLiS2Inv, 64)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS2Inv, 32))), q)
+ mstore(add(pMem, add(pLiS2Inv, 32)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pLiS2Inv)), q)
+ mstore(add(pMem, pLiS2Inv), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 96))), q)
+ mstore(add(pMem, add(pLiS1Inv, 96)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 64))), q)
+ mstore(add(pMem, add(pLiS1Inv, 64)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS1Inv, 32))), q)
+ mstore(add(pMem, add(pLiS1Inv, 32)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pLiS1Inv)), q)
+ mstore(add(pMem, pLiS1Inv), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 224))), q)
+ mstore(add(pMem, add(pLiS0Inv, 224)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 192))), q)
+ mstore(add(pMem, add(pLiS0Inv, 192)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 160))), q)
+ mstore(add(pMem, add(pLiS0Inv, 160)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 128))), q)
+ mstore(add(pMem, add(pLiS0Inv, 128)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 96))), q)
+ mstore(add(pMem, add(pLiS0Inv, 96)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 64))), q)
+ mstore(add(pMem, add(pLiS0Inv, 64)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, add(pLiS0Inv, 32))), q)
+ mstore(add(pMem, add(pLiS0Inv, 32)), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pLiS0Inv)), q)
+ mstore(add(pMem, pLiS0Inv), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pDenH2)), q)
+ mstore(add(pMem, pDenH2), inv)
+ pAux := sub(pAux, 32)
+ inv := mulmod(acc, mload(pAux), q)
+ acc := mulmod(acc, mload(add(pMem, pDenH1)), q)
+ mstore(add(pMem, pDenH1), inv)
+
+ mstore(add(pMem, pZhInv), acc)
+ }
+
+ function checkField(v) {
+ if iszero(lt(v, q)) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+ }
+
+ function checkPointBelongsToBN128Curve(p) {
+ let x := calldataload(p)
+ let y := calldataload(add(p, 32))
+
+ // Check that the point is on the curve
+ // y^2 = x^3 + 3
+ let x3_3 := addmod(mulmod(x, mulmod(x, x, qf), qf), 3, qf)
+ let y2 := mulmod(y, y, qf)
+
+ if iszero(eq(x3_3, y2)) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+ }
+
+ // Validate all the evaluations sent by the prover ∈ F
+ function checkInput() {
+ // Check proof commitments fullfill bn128 curve equation Y^2 = X^3 + 3
+ checkPointBelongsToBN128Curve(pC1)
+ checkPointBelongsToBN128Curve(pC2)
+ checkPointBelongsToBN128Curve(pW1)
+ checkPointBelongsToBN128Curve(pW2)
+
+ checkField(calldataload(pEval_ql))
+ checkField(calldataload(pEval_qr))
+ checkField(calldataload(pEval_qm))
+ checkField(calldataload(pEval_qo))
+ checkField(calldataload(pEval_qc))
+ checkField(calldataload(pEval_s1))
+ checkField(calldataload(pEval_s2))
+ checkField(calldataload(pEval_s3))
+ checkField(calldataload(pEval_a))
+ checkField(calldataload(pEval_b))
+ checkField(calldataload(pEval_c))
+ checkField(calldataload(pEval_z))
+ checkField(calldataload(pEval_zw))
+ checkField(calldataload(pEval_t1w))
+ checkField(calldataload(pEval_t2w))
+ checkField(calldataload(pEval_inv))
+
+ // Points are checked in the point operations precompiled smart contracts
+ }
+
+ function computeChallenges(pMem, pPublic) {
+ // Compute challenge.beta & challenge.gamma
+ mstore(add(pMem, 1920), C0x)
+ mstore(add(pMem, 1952), C0y)
+
+ mstore(add(pMem, 1984), calldataload(pPublic))
+
+ mstore(add(pMem, 2016), calldataload(pC1))
+ mstore(add(pMem, 2048), calldataload(add(pC1, 32)))
+
+ mstore(
+ add(pMem, pBeta),
+ mod(keccak256(add(pMem, lastMem), 160), q)
+ )
+ mstore(
+ add(pMem, pGamma),
+ mod(keccak256(add(pMem, pBeta), 32), q)
+ )
+
+ // Get xiSeed & xiSeed2
+ mstore(add(pMem, lastMem), mload(add(pMem, pGamma)))
+ mstore(add(pMem, 1952), calldataload(pC2))
+ mstore(add(pMem, 1984), calldataload(add(pC2, 32)))
+ let xiSeed := mod(keccak256(add(pMem, lastMem), 96), q)
+
+ mstore(add(pMem, pXiSeed), xiSeed)
+ mstore(add(pMem, pXiSeed2), mulmod(xiSeed, xiSeed, q))
+
+ // Compute roots.S0.h0w8
+ mstore(
+ add(pMem, pH0w8_0),
+ mulmod(
+ mload(add(pMem, pXiSeed2)),
+ mload(add(pMem, pXiSeed)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH0w8_1),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_1, q)
+ )
+ mstore(
+ add(pMem, pH0w8_2),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_2, q)
+ )
+ mstore(
+ add(pMem, pH0w8_3),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_3, q)
+ )
+ mstore(
+ add(pMem, pH0w8_4),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_4, q)
+ )
+ mstore(
+ add(pMem, pH0w8_5),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_5, q)
+ )
+ mstore(
+ add(pMem, pH0w8_6),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_6, q)
+ )
+ mstore(
+ add(pMem, pH0w8_7),
+ mulmod(mload(add(pMem, pH0w8_0)), w8_7, q)
+ )
+
+ // Compute roots.S1.h1w4
+ mstore(
+ add(pMem, pH1w4_0),
+ mulmod(
+ mload(add(pMem, pH0w8_0)),
+ mload(add(pMem, pH0w8_0)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH1w4_1),
+ mulmod(mload(add(pMem, pH1w4_0)), w4, q)
+ )
+ mstore(
+ add(pMem, pH1w4_2),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_2, q)
+ )
+ mstore(
+ add(pMem, pH1w4_3),
+ mulmod(mload(add(pMem, pH1w4_0)), w4_3, q)
+ )
+
+ // Compute roots.S2.h2w3
+ mstore(
+ add(pMem, pH2w3_0),
+ mulmod(
+ mload(add(pMem, pH1w4_0)),
+ mload(add(pMem, pXiSeed2)),
+ q
+ )
+ )
+ mstore(
+ add(pMem, pH2w3_1),
+ mulmod(mload(add(pMem, pH2w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH2w3_2),
+ mulmod(mload(add(pMem, pH2w3_0)), w3_2, q)
+ )
+
+ // Compute roots.S2.h2w3
+ mstore(
+ add(pMem, pH3w3_0),
+ mulmod(mload(add(pMem, pH2w3_0)), wr, q)
+ )
+ mstore(
+ add(pMem, pH3w3_1),
+ mulmod(mload(add(pMem, pH3w3_0)), w3, q)
+ )
+ mstore(
+ add(pMem, pH3w3_2),
+ mulmod(mload(add(pMem, pH3w3_0)), w3_2, q)
+ )
+
+ let xin := mulmod(
+ mulmod(
+ mload(add(pMem, pH2w3_0)),
+ mload(add(pMem, pH2w3_0)),
+ q
+ ),
+ mload(add(pMem, pH2w3_0)),
+ q
+ )
+ mstore(add(pMem, pXi), xin)
+
+ // Compute xi^n
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mulmod(xin, xin, q)
+
+ xin := mod(add(sub(xin, 1), q), q)
+ mstore(add(pMem, pZh), xin)
+ mstore(add(pMem, pZhInv), xin) // We will invert later together with lagrange pols
+
+ // Compute challenge.alpha
+ mstore(add(pMem, lastMem), xiSeed)
+
+ calldatacopy(add(pMem, 1952), pEval_ql, 480)
+ mstore(
+ add(pMem, pAlpha),
+ mod(keccak256(add(pMem, lastMem), 512), q)
+ )
+
+ // Compute challenge.y
+ mstore(add(pMem, lastMem), mload(add(pMem, pAlpha)))
+ mstore(add(pMem, 1952), calldataload(pW1))
+ mstore(add(pMem, 1984), calldataload(add(pW1, 32)))
+ mstore(add(pMem, pY), mod(keccak256(add(pMem, lastMem), 96), q))
+ }
+
+ function computeLiS0(pMem) {
+ let root0 := mload(add(pMem, pH0w8_0))
+ let y := mload(add(pMem, pY))
+ let den1 := 1
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+
+ den1 := mulmod(8, den1, q)
+
+ let den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 0), 8), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 1), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 2), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 3), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 4), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(4, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 5), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(5, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 6), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(6, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 192)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH0w8_0, mul(mod(mul(7, 7), 8), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH0w8_0, mul(7, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS0Inv, 224)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+ }
+
+ function computeLiS1(pMem) {
+ let root0 := mload(add(pMem, pH1w4_0))
+ let y := mload(add(pMem, pY))
+ let den1 := 1
+ den1 := mulmod(den1, root0, q)
+ den1 := mulmod(den1, root0, q)
+
+ den1 := mulmod(4, den1, q)
+
+ let den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 0), 4), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 1), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 2), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH1w4_0, mul(mod(mul(3, 3), 4), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH1w4_0, mul(3, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS1Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+ }
+
+ function computeLiS2(pMem) {
+ let y := mload(add(pMem, pY))
+
+ let den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH2w3_0)), q),
+ addmod(
+ mload(add(pMem, pXi)),
+ mod(sub(q, mulmod(mload(add(pMem, pXi)), w1, q)), q),
+ q
+ ),
+ q
+ )
+
+ let den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ let den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 0)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 32)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH2w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH2w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 64)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den1 := mulmod(
+ mulmod(3, mload(add(pMem, pH3w3_0)), q),
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mod(sub(q, mload(add(pMem, pXi))), q),
+ q
+ ),
+ q
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 0), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(0, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 96)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 1), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(1, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 128)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+
+ den2 := mload(
+ add(pMem, add(pH3w3_0, mul(mod(mul(2, 2), 3), 32)))
+ )
+ den3 := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, add(pH3w3_0, mul(2, 32))))), q),
+ q
+ )
+
+ mstore(
+ add(pMem, add(pLiS2Inv, 160)),
+ mulmod(den1, mulmod(den2, den3, q), q)
+ )
+ }
+
+ // Prepare all the denominators that must be inverted, placed them in consecutive memory addresses
+ function computeInversions(pMem) {
+ // 1/ZH(xi) used in steps 8 and 9 of the verifier to multiply by 1/Z_H(xi)
+ // Value computed during computeChallenges function and stores in pMem+pZhInv
+
+ // 1/((y - h1) (y - h1w4) (y - h1w4_2) (y - h1w4_3))
+ // used in steps 10 and 11 of the verifier
+ let y := mload(add(pMem, pY))
+ let w := addmod(y, mod(sub(q, mload(add(pMem, pH1w4_0))), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH1w4_3))), q), q),
+ q
+ )
+ mstore(add(pMem, pDenH1), w)
+
+ // 1/((y - h2) (y - h2w3) (y - h2w3_2) (y - h3) (y - h3w3) (y - h3w3_2))
+ w := addmod(y, mod(sub(q, mload(add(pMem, pH2w3_0))), q), q)
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH2w3_2))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_0))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_1))), q), q),
+ q
+ )
+ w := mulmod(
+ w,
+ addmod(y, mod(sub(q, mload(add(pMem, pH3w3_2))), q), q),
+ q
+ )
+ mstore(add(pMem, pDenH2), w)
+
+ // Denominator needed in the verifier when computing L_i^{S0}(X)
+ computeLiS0(pMem)
+
+ // Denominator needed in the verifier when computing L_i^{S1}(X)
+ computeLiS1(pMem)
+
+ // Denominator needed in the verifier when computing L_i^{S2}(X)
+ computeLiS2(pMem)
+
+ // L_i where i from 1 to num public inputs, needed in step 6 and 7 of the verifier to compute L_1(xi) and PI(xi)
+ w := 1
+ let xi := mload(add(pMem, pXi))
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(n, mod(add(sub(xi, w), q), q), q)
+ )
+
+ // Execute Montgomery batched inversions of the previous prepared values
+ inverseArray(pMem)
+ }
+
+ // Compute Lagrange polynomial evaluation L_i(xi)
+ function computeLagrange(pMem) {
+ let zh := mload(add(pMem, pZh))
+ let w := 1
+
+ mstore(
+ add(pMem, pEval_l1),
+ mulmod(mload(add(pMem, pEval_l1)), zh, q)
+ )
+ }
+
+ // Compute public input polynomial evaluation PI(xi)
+ function computePi(pMem, pPub) {
+ let pi := 0
+ pi := mod(
+ add(
+ sub(
+ pi,
+ mulmod(
+ mload(add(pMem, pEval_l1)),
+ calldataload(pPub),
+ q
+ )
+ ),
+ q
+ ),
+ q
+ )
+
+ mstore(add(pMem, pPi), pi)
+ }
+
+ // Compute r0(y) by interpolating the polynomial r0(X) using 8 points (x,y)
+ // where x = {h9, h0w8, h0w8^2, h0w8^3, h0w8^4, h0w8^5, h0w8^6, h0w8^7}
+ // and y = {C0(h0), C0(h0w8), C0(h0w8^2), C0(h0w8^3), C0(h0w8^4), C0(h0w8^5), C0(h0w8^6), C0(h0w8^7)}
+ // and computing C0(xi)
+ function computeR0(pMem) {
+ let num := 1
+ let y := mload(add(pMem, pY))
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+
+ num := addmod(num, mod(sub(q, mload(add(pMem, pXi))), q), q)
+
+ let res
+ let h0w80
+ let c0Value
+ let h0w8i
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_0))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 0))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_1))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 32))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_2))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 64))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_3))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 96))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_4))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 128))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_5))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 160))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_6))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 192))), q),
+ q
+ ),
+ q
+ )
+
+ // Compute c0Value = ql + (h0w8i) qr + (h0w8i)^2 qo + (h0w8i)^3 qm + (h0w8i)^4 qc +
+ // + (h0w8i)^5 S1 + (h0w8i)^6 S2 + (h0w8i)^7 S3
+ h0w80 := mload(add(pMem, pH0w8_7))
+ c0Value := addmod(
+ calldataload(pEval_ql),
+ mulmod(calldataload(pEval_qr), h0w80, q),
+ q
+ )
+ h0w8i := mulmod(h0w80, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qo), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qm), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_qc), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s1), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s2), h0w8i, q),
+ q
+ )
+ h0w8i := mulmod(h0w8i, h0w80, q)
+ c0Value := addmod(
+ c0Value,
+ mulmod(calldataload(pEval_s3), h0w8i, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c0Value,
+ mulmod(num, mload(add(pMem, add(pLiS0Inv, 224))), q),
+ q
+ ),
+ q
+ )
+
+ mstore(add(pMem, pR0), res)
+ }
+
+ // Compute r1(y) by interpolating the polynomial r1(X) using 4 points (x,y)
+ // where x = {h1, h1w4, h1w4^2, h1w4^3}
+ // and y = {C1(h1), C1(h1w4), C1(h1w4^2), C1(h1w4^3)}
+ // and computing T0(xi)
+ function computeR1(pMem) {
+ let num := 1
+ let y := mload(add(pMem, pY))
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+ num := mulmod(num, y, q)
+
+ num := addmod(num, mod(sub(q, mload(add(pMem, pXi))), q), q)
+
+ let t0
+ let evalA := calldataload(pEval_a)
+ let evalB := calldataload(pEval_b)
+ let evalC := calldataload(pEval_c)
+
+ t0 := mulmod(calldataload(pEval_ql), evalA, q)
+ t0 := addmod(t0, mulmod(calldataload(pEval_qr), evalB, q), q)
+ t0 := addmod(
+ t0,
+ mulmod(calldataload(pEval_qm), mulmod(evalA, evalB, q), q),
+ q
+ )
+ t0 := addmod(t0, mulmod(calldataload(pEval_qo), evalC, q), q)
+ t0 := addmod(t0, calldataload(pEval_qc), q)
+ t0 := addmod(t0, mload(add(pMem, pPi)), q)
+ t0 := mulmod(t0, mload(add(pMem, pZhInv)), q)
+
+ let res
+ let c1Value
+ let h1w4
+ let square
+ c1Value := evalA
+ h1w4 := mload(add(pMem, pH1w4_0))
+
+ c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
+ square := mulmod(h1w4, h1w4, q)
+ c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ c1Value := evalA
+ h1w4 := mload(add(pMem, pH1w4_1))
+
+ c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
+ square := mulmod(h1w4, h1w4, q)
+ c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ c1Value := evalA
+ h1w4 := mload(add(pMem, pH1w4_2))
+
+ c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
+ square := mulmod(h1w4, h1w4, q)
+ c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ c1Value := evalA
+ h1w4 := mload(add(pMem, pH1w4_3))
+
+ c1Value := addmod(c1Value, mulmod(h1w4, evalB, q), q)
+ square := mulmod(h1w4, h1w4, q)
+ c1Value := addmod(c1Value, mulmod(square, evalC, q), q)
+ c1Value := addmod(
+ c1Value,
+ mulmod(mulmod(square, h1w4, q), t0, q),
+ q
+ )
+
+ res := addmod(
+ res,
+ mulmod(
+ c1Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS1Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ mstore(add(pMem, pR1), res)
+ }
+
+ // Compute r2(y) by interpolating the polynomial r2(X) using 6 points (x,y)
+ // where x = {[h2, h2w3, h2w3^2], [h3, h3w3, h3w3^2]}
+ // and y = {[C2(h2), C2(h2w3), C2(h2w3^2)], [C2(h3), C2(h3w3), C2(h3w3^2)]}
+ // and computing T1(xi) and T2(xi)
+ function computeR2(pMem) {
+ let y := mload(add(pMem, pY))
+ let num := 1
+ num := mulmod(y, num, q)
+ num := mulmod(y, num, q)
+ num := mulmod(y, num, q)
+ num := mulmod(y, num, q)
+ num := mulmod(y, num, q)
+ num := mulmod(y, num, q)
+
+ let num2 := 1
+ num2 := mulmod(y, num2, q)
+ num2 := mulmod(y, num2, q)
+ num2 := mulmod(y, num2, q)
+ num2 := mulmod(
+ num2,
+ addmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ ),
+ q
+ )
+
+ num := addmod(num, mod(sub(q, num2), q), q)
+
+ num2 := mulmod(
+ mulmod(mload(add(pMem, pXi)), w1, q),
+ mload(add(pMem, pXi)),
+ q
+ )
+
+ num := addmod(num, num2, q)
+
+ let t1
+ let t2
+ let betaXi := mulmod(
+ mload(add(pMem, pBeta)),
+ mload(add(pMem, pXi)),
+ q
+ )
+ let gamma := mload(add(pMem, pGamma))
+
+ t2 := addmod(calldataload(pEval_a), addmod(betaXi, gamma, q), q)
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_b),
+ addmod(mulmod(betaXi, k1, q), gamma, q),
+ q
+ ),
+ q
+ )
+ t2 := mulmod(
+ t2,
+ addmod(
+ calldataload(pEval_c),
+ addmod(mulmod(betaXi, k2, q), gamma, q),
+ q
+ ),
+ q
+ )
+ t2 := mulmod(t2, calldataload(pEval_z), q)
+
+ //Let's use t1 as a temporal variable to save one local
+ t1 := addmod(
+ calldataload(pEval_a),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s1),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_b),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s2),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
+ t1 := mulmod(
+ t1,
+ addmod(
+ calldataload(pEval_c),
+ addmod(
+ mulmod(
+ mload(add(pMem, pBeta)),
+ calldataload(pEval_s3),
+ q
+ ),
+ gamma,
+ q
+ ),
+ q
+ ),
+ q
+ )
+ t1 := mulmod(t1, calldataload(pEval_zw), q)
+
+ t2 := addmod(t2, mod(sub(q, t1), q), q)
+ t2 := mulmod(t2, mload(add(pMem, pZhInv)), q)
+
+ // Compute T1(xi)
+ t1 := sub(calldataload(pEval_z), 1)
+ t1 := mulmod(t1, mload(add(pMem, pEval_l1)), q)
+ t1 := mulmod(t1, mload(add(pMem, pZhInv)), q)
+
+ // Let's use local variable gamma to save the result
+ gamma := 0
+
+ let hw
+ let c2Value
+
+ hw := mload(add(pMem, pH2w3_0))
+ c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
+ c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(0, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ hw := mload(add(pMem, pH2w3_1))
+ c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
+ c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(1, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ hw := mload(add(pMem, pH2w3_2))
+ c2Value := addmod(calldataload(pEval_z), mulmod(hw, t1, q), q)
+ c2Value := addmod(c2Value, mulmod(mulmod(hw, hw, q), t2, q), q)
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(2, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ hw := mload(add(pMem, pH3w3_0))
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(3, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ hw := mload(add(pMem, pH3w3_1))
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(4, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ hw := mload(add(pMem, pH3w3_2))
+ c2Value := addmod(
+ calldataload(pEval_zw),
+ mulmod(hw, calldataload(pEval_t1w), q),
+ q
+ )
+ c2Value := addmod(
+ c2Value,
+ mulmod(mulmod(hw, hw, q), calldataload(pEval_t2w), q),
+ q
+ )
+ gamma := addmod(
+ gamma,
+ mulmod(
+ c2Value,
+ mulmod(
+ num,
+ mload(add(pMem, add(pLiS2Inv, mul(5, 32)))),
+ q
+ ),
+ q
+ ),
+ q
+ )
+
+ mstore(add(pMem, pR2), gamma)
+ }
+
+ // G1 function to accumulate a G1 value to an address
+ function g1_acc(pR, pP) {
+ let mIn := mload(0x40)
+ mstore(mIn, mload(pR))
+ mstore(add(mIn, 32), mload(add(pR, 32)))
+ mstore(add(mIn, 64), mload(pP))
+ mstore(add(mIn, 96), mload(add(pP, 32)))
+
+ let success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
+
+ if iszero(success) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+ }
+
+ // G1 function to multiply a G1 value to value in an address
+ function g1_mulAcc(pR, pP, s) {
+ let success
+ let mIn := mload(0x40)
+ mstore(mIn, calldataload(pP))
+ mstore(add(mIn, 32), calldataload(add(pP, 32)))
+ mstore(add(mIn, 64), s)
+
+ success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
+
+ if iszero(success) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+
+ mstore(add(mIn, 64), mload(pR))
+ mstore(add(mIn, 96), mload(add(pR, 32)))
+
+ success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
+
+ if iszero(success) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+ }
+
+ // G1 function to multiply a G1 value(x,y) to value in an address
+ function g1_mulAccC(pR, x, y, s) {
+ let success
+ let mIn := mload(0x40)
+ mstore(mIn, x)
+ mstore(add(mIn, 32), y)
+ mstore(add(mIn, 64), s)
+
+ success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
+
+ if iszero(success) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+
+ mstore(add(mIn, 64), mload(pR))
+ mstore(add(mIn, 96), mload(add(pR, 32)))
+
+ success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
+
+ if iszero(success) {
+ mstore(0, 0)
+ return(0, 0x20)
+ }
+ }
+
+ function computeFEJ(pMem) {
+ // Prepare shared numerator between F, E and J to reuse it
+ let y := mload(add(pMem, pY))
+ let numerator := addmod(
+ y,
+ mod(sub(q, mload(add(pMem, pH0w8_0))), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_1))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_2))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_3))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_4))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_5))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_6))), q), q),
+ q
+ )
+ numerator := mulmod(
+ numerator,
+ addmod(y, mod(sub(q, mload(add(pMem, pH0w8_7))), q), q),
+ q
+ )
+
+ // Prepare shared quotient between F and E to reuse it
+ let quotient1 := mulmod(
+ mload(add(pMem, pAlpha)),
+ mulmod(numerator, mload(add(pMem, pDenH1)), q),
+ q
+ )
+ let quotient2 := mulmod(
+ mulmod(
+ mload(add(pMem, pAlpha)),
+ mload(add(pMem, pAlpha)),
+ q
+ ),
+ mulmod(numerator, mload(add(pMem, pDenH2)), q),
+ q
+ )
+
+ // Compute full batched polynomial commitment [F]_1
+ mstore(add(pMem, pF), C0x)
+ mstore(add(pMem, add(pF, 32)), C0y)
+ g1_mulAcc(add(pMem, pF), pC1, quotient1)
+ g1_mulAcc(add(pMem, pF), pC2, quotient2)
+
+ // Compute group-encoded batch evaluation [E]_1
+ g1_mulAccC(
+ add(pMem, pE),
+ G1x,
+ G1y,
+ addmod(
+ mload(add(pMem, pR0)),
+ addmod(
+ mulmod(quotient1, mload(add(pMem, pR1)), q),
+ mulmod(quotient2, mload(add(pMem, pR2)), q),
+ q
+ ),
+ q
+ )
+ )
+
+ // Compute the full difference [J]_1
+ g1_mulAcc(add(pMem, pJ), pW1, numerator)
+ }
+
+ // Validate all evaluations with a pairing checking that e([F]_1 - [E]_1 - [J]_1 + y[W2]_1, [1]_2) == e([W']_1, [x]_2)
+ function checkPairing(pMem) -> isOk {
+ let mIn := mload(0x40)
+
+ // First pairing value
+ // Compute -E
+ mstore(
+ add(add(pMem, pE), 32),
+ mod(sub(qf, mload(add(add(pMem, pE), 32))), qf)
+ )
+ // Compute -J
+ mstore(
+ add(add(pMem, pJ), 32),
+ mod(sub(qf, mload(add(add(pMem, pJ), 32))), qf)
+ )
+ // F = F - E - J + y·W2
+ g1_acc(add(pMem, pF), add(pMem, pE))
+ g1_acc(add(pMem, pF), add(pMem, pJ))
+ g1_mulAcc(add(pMem, pF), pW2, mload(add(pMem, pY)))
+
+ mstore(mIn, mload(add(pMem, pF)))
+ mstore(add(mIn, 32), mload(add(add(pMem, pF), 32)))
+
+ // Second pairing value
+ mstore(add(mIn, 64), G2x2)
+ mstore(add(mIn, 96), G2x1)
+ mstore(add(mIn, 128), G2y2)
+ mstore(add(mIn, 160), G2y1)
+
+ // Third pairing value
+ // Compute -W2
+ mstore(add(mIn, 192), calldataload(pW2))
+ let s := calldataload(add(pW2, 32))
+ s := mod(sub(qf, s), qf)
+ mstore(add(mIn, 224), s)
+
+ // Fourth pairing value
+ mstore(add(mIn, 256), X2x2)
+ mstore(add(mIn, 288), X2x1)
+ mstore(add(mIn, 320), X2y2)
+ mstore(add(mIn, 352), X2y1)
+
+ let success := staticcall(
+ sub(gas(), 2000),
+ 8,
+ mIn,
+ 384,
+ mIn,
+ 0x20
+ )
+
+ isOk := and(success, mload(mIn))
+ }
+
+ let pMem := mload(0x40)
+ mstore(0x40, add(pMem, lastMem))
+
+ // Validate that all evaluations ∈ F
+ checkInput()
+
+ // Compute the challenges: beta, gamma, xi, alpha and y ∈ F, h1w4/h2w3/h3w3 roots, xiN and zh(xi)
+ computeChallenges(pMem, pubSignals)
+
+ // To divide prime fields the Extended Euclidean Algorithm for computing modular inverses is needed.
+ // The Montgomery batch inversion algorithm allow us to compute n inverses reducing to a single one inversion.
+ // More info: https://vitalik.ca/general/2018/07/21/starks_part_3.html
+ // To avoid this single inverse computation on-chain, it has been computed in proving time and send it to the verifier.
+ // Therefore, the verifier:
+ // 1) Prepare all the denominators to inverse
+ // 2) Check the inverse sent by the prover it is what it should be
+ // 3) Compute the others inverses using the Montgomery Batched Algorithm using the inverse sent to avoid the inversion operation it does.
+ computeInversions(pMem)
+
+ // Compute Lagrange polynomial evaluations Li(xi)
+ computeLagrange(pMem)
+
+ // Compute public input polynomial evaluation PI(xi) = \sum_i^l -public_input_i·L_i(xi)
+ computePi(pMem, pubSignals)
+
+ // Computes r1(y) and r2(y)
+ computeR0(pMem)
+ computeR1(pMem)
+ computeR2(pMem)
+
+ // Compute full batched polynomial commitment [F]_1, group-encoded batch evaluation [E]_1 and the full difference [J]_1
+ computeFEJ(pMem)
+
+ // Validate all evaluations
+ let isValid := checkPairing(pMem)
+
+ mstore(0, isValid)
+ return(0, 0x20)
+ }
+ }
+}
diff --git a/contracts/verifiers/FflonkVerifier.sol b/contracts/verifiers/FflonkVerifier_13.sol
similarity index 99%
rename from contracts/verifiers/FflonkVerifier.sol
rename to contracts/verifiers/FflonkVerifier_13.sol
index 99f49dff1..e28041ef1 100644
--- a/contracts/verifiers/FflonkVerifier.sol
+++ b/contracts/verifiers/FflonkVerifier_13.sol
@@ -20,7 +20,7 @@
pragma solidity >=0.7.0 <0.9.0;
-contract FflonkVerifier {
+contract FflonkVerifier_13 {
uint32 constant n = 16777216; // Domain size
// Verification Key data
@@ -48,8 +48,8 @@ contract FflonkVerifier {
uint256 constant w8_7 = 8613538655231327379234925296132678673308827349856085326283699237864372525723;
// Verifier preprocessed input C_0(x)·[1]_1
- uint256 constant C0x = 19531210301294568511992648735135291982401633864004026433715722115099857739632;
- uint256 constant C0y = 16913517370715546973488219367119174715262034757907912789481968159710930517904;
+ uint256 constant C0x = 13979175079588675506680419163737534969820328203352260322294459421414714595611;
+ uint256 constant C0y = 18009742543832671334106659031569207850149449016303412599494859844148229216194;
// Verifier preprocessed input x·[1]_2
uint256 constant X2x1 = 21831381940315734285607113342023901060522397560371972897001948545212302161822;
diff --git a/contracts/verifiers/v4.0.0-rc.3/PlonkVerifier.sol b/contracts/verifiers/v4.0.0-rc.3/PlonkVerifier.sol
new file mode 100644
index 000000000..10aa7b15e
--- /dev/null
+++ b/contracts/verifiers/v4.0.0-rc.3/PlonkVerifier.sol
@@ -0,0 +1,1379 @@
+// SPDX-License-Identifier: Apache-2.0
+
+// Copyright 2023 Consensys Software Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by gnark DO NOT EDIT
+
+pragma solidity ^0.8.0;
+
+contract PlonkVerifier {
+ uint256 private constant R_MOD =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495617;
+ uint256 private constant R_MOD_MINUS_ONE =
+ 21888242871839275222246405745257275088548364400416034343698204186575808495616;
+ uint256 private constant P_MOD =
+ 21888242871839275222246405745257275088696311157297823662689037894645226208583;
+
+ uint256 private constant G2_SRS_0_X_0 =
+ 11559732032986387107991004021392285783925812861821192530917403151452391805634;
+ uint256 private constant G2_SRS_0_X_1 =
+ 10857046999023057135944570762232829481370756359578518086990519993285655852781;
+ uint256 private constant G2_SRS_0_Y_0 =
+ 4082367875863433681332203403145435568316851327593401208105741076214120093531;
+ uint256 private constant G2_SRS_0_Y_1 =
+ 8495653923123431417604973247489272438418190587263600148770280649306958101930;
+
+ uint256 private constant G2_SRS_1_X_0 =
+ 15805639136721018565402881920352193254830339253282065586954346329754995870280;
+ uint256 private constant G2_SRS_1_X_1 =
+ 19089565590083334368588890253123139704298730990782503769911324779715431555531;
+ uint256 private constant G2_SRS_1_Y_0 =
+ 9779648407879205346559610309258181044130619080926897934572699915909528404984;
+ uint256 private constant G2_SRS_1_Y_1 =
+ 6779728121489434657638426458390319301070371227460768374343986326751507916979;
+
+ uint256 private constant G1_SRS_X =
+ 14312776538779914388377568895031746459131577658076416373430523308756343304251;
+ uint256 private constant G1_SRS_Y =
+ 11763105256161367503191792604679297387056316997144156930871823008787082098465;
+
+ // ----------------------- vk ---------------------
+ uint256 private constant VK_NB_PUBLIC_INPUTS = 2;
+ uint256 private constant VK_DOMAIN_SIZE = 16777216;
+ uint256 private constant VK_INV_DOMAIN_SIZE =
+ 21888241567198334088790460357988866238279339518792980768180410072331574733841;
+ uint256 private constant VK_OMEGA =
+ 5709868443893258075976348696661355716898495876243883251619397131511003808859;
+ uint256 private constant VK_QL_COM_X =
+ 17984004271810887111892332882651374483612811613160171882231530673955342124072;
+ uint256 private constant VK_QL_COM_Y =
+ 13277994607875064672295433418223618455646015691912141325106751561841646085822;
+ uint256 private constant VK_QR_COM_X =
+ 16336286973672788525637509231329701034039020185740400021577697914995487271901;
+ uint256 private constant VK_QR_COM_Y =
+ 88284377293612431075210969180485407669835075356048788125030179865751136579;
+ uint256 private constant VK_QM_COM_X =
+ 10856514239855788242760873537198968126773773371401212930763195728908952457266;
+ uint256 private constant VK_QM_COM_Y =
+ 9275209459688740642101488227886989724826404626746083670876354123229317070279;
+ uint256 private constant VK_QO_COM_X =
+ 11483266664351462882096699260743761962335837409017508503826409502538996076321;
+ uint256 private constant VK_QO_COM_Y =
+ 17394959804451514544078291653193154652690985857122468223674247897665667008225;
+ uint256 private constant VK_QK_COM_X =
+ 6378083169737830823085597784511445554718388062388953364429190548392020833332;
+ uint256 private constant VK_QK_COM_Y =
+ 12423874058816725405347015291038805106767729770869142043443023930694783565135;
+
+ uint256 private constant VK_S1_COM_X =
+ 8432363989348148399267595343996871949745756313266171098803972147558566645391;
+ uint256 private constant VK_S1_COM_Y =
+ 21830041218908693046173167152196424202345484683169853420596524951634570306585;
+
+ uint256 private constant VK_S2_COM_X =
+ 2889872191603241225798623124219684248629415321428218534303823116357979417612;
+ uint256 private constant VK_S2_COM_Y =
+ 8446598484540146291961338772594737249603462456099116591415979984815127389111;
+
+ uint256 private constant VK_S3_COM_X =
+ 12894021857927799668653295424700631150139887020229360316861211114803005826079;
+ uint256 private constant VK_S3_COM_Y =
+ 5332155988317853016248818837542073627058808403298822656476772250044723938116;
+
+ uint256 private constant VK_COSET_SHIFT = 5;
+
+ uint256 private constant VK_QCP_0_X =
+ 16113316688614670925300831064391815772431716488200414163545127725991745431527;
+ uint256 private constant VK_QCP_0_Y =
+ 18613967203673816695007264416375047840688367875268537453854528850830700989951;
+
+ uint256 private constant VK_INDEX_COMMIT_API_0 = 10853426;
+ uint256 private constant VK_NB_CUSTOM_GATES = 1;
+
+ // ------------------------------------------------
+
+ // size of the proof without call custom gate
+ uint256 private constant FIXED_PROOF_SIZE = 0x300;
+
+ // offset proof
+
+ uint256 private constant PROOF_L_COM_X = 0x0;
+ uint256 private constant PROOF_L_COM_Y = 0x20;
+ uint256 private constant PROOF_R_COM_X = 0x40;
+ uint256 private constant PROOF_R_COM_Y = 0x60;
+ uint256 private constant PROOF_O_COM_X = 0x80;
+ uint256 private constant PROOF_O_COM_Y = 0xa0;
+
+ // h = h_0 + x^{n+2}h_1 + x^{2(n+2)}h_2
+ uint256 private constant PROOF_H_0_COM_X = 0xc0;
+ uint256 private constant PROOF_H_0_COM_Y = 0xe0;
+ uint256 private constant PROOF_H_1_COM_X = 0x100;
+ uint256 private constant PROOF_H_1_COM_Y = 0x120;
+ uint256 private constant PROOF_H_2_COM_X = 0x140;
+ uint256 private constant PROOF_H_2_COM_Y = 0x160;
+
+ // "evaluations of wire polynomials at zeta
+ uint256 private constant PROOF_L_AT_ZETA = 0x180;
+ uint256 private constant PROOF_R_AT_ZETA = 0x1a0;
+ uint256 private constant PROOF_O_AT_ZETA = 0x1c0;
+
+ // S1(zeta),S2(zeta)
+ uint256 private constant PROOF_S1_AT_ZETA = 0x1e0; // Sσ1(zeta)
+ uint256 private constant PROOF_S2_AT_ZETA = 0x200; // Sσ2(zeta)
+
+ // [Z]
+ uint256 private constant PROOF_GRAND_PRODUCT_COMMITMENT_X = 0x220;
+ uint256 private constant PROOF_GRAND_PRODUCT_COMMITMENT_Y = 0x240;
+
+ uint256 private constant PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA = 0x260; // z(w*zeta)
+
+ // Folded proof for the opening of linearised poly, l, r, o, s_1, s_2, qcp
+ uint256 private constant PROOF_BATCH_OPENING_AT_ZETA_X = 0x280;
+ uint256 private constant PROOF_BATCH_OPENING_AT_ZETA_Y = 0x2a0;
+
+ uint256 private constant PROOF_OPENING_AT_ZETA_OMEGA_X = 0x2c0;
+ uint256 private constant PROOF_OPENING_AT_ZETA_OMEGA_Y = 0x2e0;
+
+ uint256 private constant PROOF_OPENING_QCP_AT_ZETA = 0x300;
+ uint256 private constant PROOF_BSB_COMMITMENTS = 0x320;
+
+ // -------- offset state
+
+ // challenges to check the claimed quotient
+
+ uint256 private constant STATE_ALPHA = 0x0;
+ uint256 private constant STATE_BETA = 0x20;
+ uint256 private constant STATE_GAMMA = 0x40;
+ uint256 private constant STATE_ZETA = 0x60;
+ uint256 private constant STATE_ALPHA_SQUARE_LAGRANGE_0 = 0x80;
+ uint256 private constant STATE_FOLDED_H_X = 0xa0;
+ uint256 private constant STATE_FOLDED_H_Y = 0xc0;
+ uint256 private constant STATE_LINEARISED_POLYNOMIAL_X = 0xe0;
+ uint256 private constant STATE_LINEARISED_POLYNOMIAL_Y = 0x100;
+ uint256 private constant STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA = 0x120;
+ uint256 private constant STATE_FOLDED_CLAIMED_VALUES = 0x140; // Folded proof for the opening of H, linearised poly, l, r, o, s_1, s_2, qcp
+ uint256 private constant STATE_FOLDED_DIGESTS_X = 0x160; // linearised poly, l, r, o, s_1, s_2, qcp
+ uint256 private constant STATE_FOLDED_DIGESTS_Y = 0x180;
+ uint256 private constant STATE_PI = 0x1a0;
+ uint256 private constant STATE_ZETA_POWER_N_MINUS_ONE = 0x1c0;
+ uint256 private constant STATE_GAMMA_KZG = 0x1e0;
+ uint256 private constant STATE_SUCCESS = 0x200;
+ uint256 private constant STATE_CHECK_VAR = 0x220; // /!\ this slot is used for debugging only
+ uint256 private constant STATE_LAST_MEM = 0x240;
+
+ // -------- utils (for Fiat Shamir)
+ uint256 private constant FS_ALPHA = 0x616C706861; // "alpha"
+ uint256 private constant FS_BETA = 0x62657461; // "beta"
+ uint256 private constant FS_GAMMA = 0x67616d6d61; // "gamma"
+ uint256 private constant FS_ZETA = 0x7a657461; // "zeta"
+ uint256 private constant FS_GAMMA_KZG = 0x67616d6d61; // "gamma"
+
+ // -------- errors
+ uint256 private constant ERROR_STRING_ID =
+ 0x08c379a000000000000000000000000000000000000000000000000000000000; // selector for function Error(string)
+
+ // -------- utils (for hash_fr)
+ uint256 private constant HASH_FR_BB = 340282366920938463463374607431768211456; // 2**128
+ uint256 private constant HASH_FR_ZERO_UINT256 = 0;
+ uint8 private constant HASH_FR_LEN_IN_BYTES = 48;
+ uint8 private constant HASH_FR_SIZE_DOMAIN = 11;
+ uint8 private constant HASH_FR_ONE = 1;
+ uint8 private constant HASH_FR_TWO = 2;
+
+ // -------- precompiles
+ uint8 private constant SHA2 = 0x2;
+ uint8 private constant MOD_EXP = 0x5;
+ uint8 private constant EC_ADD = 0x6;
+ uint8 private constant EC_MUL = 0x7;
+ uint8 private constant EC_PAIR = 0x8;
+
+ /// Verify a Plonk proof.
+ /// Reverts if the proof or the public inputs are malformed.
+ /// @param proof serialised plonk proof (using gnark's MarshalSolidity)
+ /// @param public_inputs (must be reduced)
+ /// @return success true if the proof passes false otherwise
+ function Verify(bytes calldata proof, uint256[] calldata public_inputs)
+ public
+ view
+ returns (bool success)
+ {
+ assembly {
+ let mem := mload(0x40)
+ let freeMem := add(mem, STATE_LAST_MEM)
+
+ // sanity checks
+ check_number_of_public_inputs(public_inputs.length)
+ check_inputs_size(public_inputs.length, public_inputs.offset)
+ check_proof_size(proof.length)
+ check_proof_openings_size(proof.offset)
+
+ // compute the challenges
+ let prev_challenge_non_reduced
+ prev_challenge_non_reduced :=
+ derive_gamma(proof.offset, public_inputs.length, public_inputs.offset)
+ prev_challenge_non_reduced := derive_beta(prev_challenge_non_reduced)
+ prev_challenge_non_reduced := derive_alpha(proof.offset, prev_challenge_non_reduced)
+ derive_zeta(proof.offset, prev_challenge_non_reduced)
+
+ // evaluation of Z=Xⁿ-1 at ζ, we save this value
+ let zeta := mload(add(mem, STATE_ZETA))
+ let zeta_power_n_minus_one :=
+ addmod(pow(zeta, VK_DOMAIN_SIZE, freeMem), sub(R_MOD, 1), R_MOD)
+ mstore(add(mem, STATE_ZETA_POWER_N_MINUS_ONE), zeta_power_n_minus_one)
+
+ // public inputs contribution
+ let l_pi := sum_pi_wo_api_commit(public_inputs.offset, public_inputs.length, freeMem)
+ let l_pi_commit := sum_pi_commit(proof.offset, public_inputs.length, freeMem)
+ l_pi := addmod(l_pi_commit, l_pi, R_MOD)
+ mstore(add(mem, STATE_PI), l_pi)
+
+ compute_alpha_square_lagrange_0()
+ compute_opening_linearised_polynomial(proof.offset)
+ fold_h(proof.offset)
+ compute_commitment_linearised_polynomial(proof.offset)
+ compute_gamma_kzg(proof.offset)
+ fold_state(proof.offset)
+ batch_verify_multi_points(proof.offset)
+
+ success := mload(add(mem, STATE_SUCCESS))
+
+ // Beginning errors -------------------------------------------------
+
+ function error_nb_public_inputs() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x1d)
+ mstore(add(ptError, 0x44), "wrong number of public inputs")
+ revert(ptError, 0x64)
+ }
+
+ /// Called when an exponentiation mod r fails
+ function error_mod_exp() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0xc)
+ mstore(add(ptError, 0x44), "error mod exp")
+ revert(ptError, 0x64)
+ }
+
+ /// Called when an operation on Bn254 fails
+ /// @dev for instance when calling EcMul on a point not on Bn254.
+ function error_ec_op() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x12)
+ mstore(add(ptError, 0x44), "error ec operation")
+ revert(ptError, 0x64)
+ }
+
+ /// Called when one of the public inputs is not reduced.
+ function error_inputs_size() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x18)
+ mstore(add(ptError, 0x44), "inputs are bigger than r")
+ revert(ptError, 0x64)
+ }
+
+ /// Called when the size proof is not as expected
+ /// @dev to avoid overflow attack for instance
+ function error_proof_size() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x10)
+ mstore(add(ptError, 0x44), "wrong proof size")
+ revert(ptError, 0x64)
+ }
+
+ /// Called when one the openings is bigger than r
+ /// The openings are the claimed evalutions of a polynomial
+ /// in a Kzg proof.
+ function error_proof_openings_size() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x16)
+ mstore(add(ptError, 0x44), "openings bigger than r")
+ revert(ptError, 0x64)
+ }
+
+ function error_pairing() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0xd)
+ mstore(add(ptError, 0x44), "error pairing")
+ revert(ptError, 0x64)
+ }
+
+ function error_verify() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0xc)
+ mstore(add(ptError, 0x44), "error verify")
+ revert(ptError, 0x64)
+ }
+
+ function error_random_generation() {
+ let ptError := mload(0x40)
+ mstore(ptError, ERROR_STRING_ID) // selector for function Error(string)
+ mstore(add(ptError, 0x4), 0x20)
+ mstore(add(ptError, 0x24), 0x14)
+ mstore(add(ptError, 0x44), "error random gen kzg")
+ revert(ptError, 0x64)
+ }
+ // end errors -------------------------------------------------
+
+ // Beginning checks -------------------------------------------------
+
+ /// @param s actual number of public inputs
+ function check_number_of_public_inputs(s) {
+ if iszero(eq(s, VK_NB_PUBLIC_INPUTS)) { error_nb_public_inputs() }
+ }
+
+ /// Checks that the public inputs are < R_MOD.
+ /// @param s number of public inputs
+ /// @param p pointer to the public inputs array
+ function check_inputs_size(s, p) {
+ for { let i } lt(i, s) { i := add(i, 1) } {
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_inputs_size() }
+ p := add(p, 0x20)
+ }
+ }
+
+ /// Checks if the proof is of the correct size
+ /// @param actual_proof_size size of the proof (not the expected size)
+ function check_proof_size(actual_proof_size) {
+ let expected_proof_size := add(FIXED_PROOF_SIZE, mul(VK_NB_CUSTOM_GATES, 0x60))
+ if iszero(eq(actual_proof_size, expected_proof_size)) { error_proof_size() }
+ }
+
+ /// Checks if the multiple openings of the polynomials are < R_MOD.
+ /// @param aproof pointer to the beginning of the proof
+ /// @dev the 'a' prepending proof is to have a local name
+ function check_proof_openings_size(aproof) {
+ // PROOF_L_AT_ZETA
+ let p := add(aproof, PROOF_L_AT_ZETA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_R_AT_ZETA
+ p := add(aproof, PROOF_R_AT_ZETA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_O_AT_ZETA
+ p := add(aproof, PROOF_O_AT_ZETA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_S1_AT_ZETA
+ p := add(aproof, PROOF_S1_AT_ZETA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_S2_AT_ZETA
+ p := add(aproof, PROOF_S2_AT_ZETA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA
+ p := add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+
+ // PROOF_OPENING_QCP_AT_ZETA
+
+ p := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
+ for { let i := 0 } lt(i, VK_NB_CUSTOM_GATES) { i := add(i, 1) } {
+ if gt(calldataload(p), R_MOD_MINUS_ONE) { error_proof_openings_size() }
+ p := add(p, 0x20)
+ }
+ }
+ // end checks -------------------------------------------------
+
+ // Beginning challenges -------------------------------------------------
+
+ /// Derive gamma as Sha256()
+ /// @param aproof pointer to the proof
+ /// @param nb_pi number of public inputs
+ /// @param pi pointer to the array of public inputs
+ /// @return the challenge gamma, not reduced
+ /// @notice The transcript is the concatenation (in this order) of:
+ /// * the word "gamma" in ascii, equal to [0x67,0x61,0x6d, 0x6d, 0x61] and encoded as a uint256.
+ /// * the commitments to the permutation polynomials S1, S2, S3, where we concatenate the coordinates of those points
+ /// * the commitments of Ql, Qr, Qm, Qo, Qk
+ /// * the public inputs
+ /// * the commitments of the wires related to the custom gates (commitments_wires_commit_api)
+ /// * commitments to L, R, O (proof__com_)
+ /// The data described above is written starting at mPtr. "gamma" lies on 5 bytes,
+ /// and is encoded as a uint256 number n. In basis b = 256, the number looks like this
+ /// [0 0 0 .. 0x67 0x61 0x6d, 0x6d, 0x61]. The first non zero entry is at position 27=0x1b
+ /// Gamma reduced (the actual challenge) is stored at add(state, state_gamma)
+ function derive_gamma(aproof, nb_pi, pi) -> gamma_not_reduced {
+ let state := mload(0x40)
+ let mPtr := add(state, STATE_LAST_MEM)
+
+ mstore(mPtr, FS_GAMMA) // "gamma"
+
+ mstore(add(mPtr, 0x20), VK_S1_COM_X)
+ mstore(add(mPtr, 0x40), VK_S1_COM_Y)
+ mstore(add(mPtr, 0x60), VK_S2_COM_X)
+ mstore(add(mPtr, 0x80), VK_S2_COM_Y)
+ mstore(add(mPtr, 0xa0), VK_S3_COM_X)
+ mstore(add(mPtr, 0xc0), VK_S3_COM_Y)
+ mstore(add(mPtr, 0xe0), VK_QL_COM_X)
+ mstore(add(mPtr, 0x100), VK_QL_COM_Y)
+ mstore(add(mPtr, 0x120), VK_QR_COM_X)
+ mstore(add(mPtr, 0x140), VK_QR_COM_Y)
+ mstore(add(mPtr, 0x160), VK_QM_COM_X)
+ mstore(add(mPtr, 0x180), VK_QM_COM_Y)
+ mstore(add(mPtr, 0x1a0), VK_QO_COM_X)
+ mstore(add(mPtr, 0x1c0), VK_QO_COM_Y)
+ mstore(add(mPtr, 0x1e0), VK_QK_COM_X)
+ mstore(add(mPtr, 0x200), VK_QK_COM_Y)
+
+ mstore(add(mPtr, 0x220), VK_QCP_0_X)
+ mstore(add(mPtr, 0x240), VK_QCP_0_Y)
+
+ // public inputs
+ let _mPtr := add(mPtr, 0x260)
+ let size_pi_in_bytes := mul(nb_pi, 0x20)
+ calldatacopy(_mPtr, pi, size_pi_in_bytes)
+ _mPtr := add(_mPtr, size_pi_in_bytes)
+
+ // commitments to l, r, o
+ let size_commitments_lro_in_bytes := 0xc0
+ calldatacopy(_mPtr, aproof, size_commitments_lro_in_bytes)
+ _mPtr := add(_mPtr, size_commitments_lro_in_bytes)
+
+ // total size is :
+ // sizegamma(=0x5) + 11*64(=0x2c0)
+ // + nb_public_inputs*0x20
+ // + nb_custom gates*0x40
+ let size := add(0x2c5, size_pi_in_bytes)
+
+ size := add(size, mul(VK_NB_CUSTOM_GATES, 0x40))
+ let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), size, mPtr, 0x20) //0x1b -> 000.."gamma"
+ if iszero(l_success) { error_verify() }
+ gamma_not_reduced := mload(mPtr)
+ mstore(add(state, STATE_GAMMA), mod(gamma_not_reduced, R_MOD))
+ }
+
+ /// derive beta as Sha256
+ /// @param gamma_not_reduced the previous challenge (gamma) not reduced
+ /// @return beta_not_reduced the next challenge, beta, not reduced
+ /// @notice the transcript consists of the previous challenge only.
+ /// The reduced version of beta is stored at add(state, state_beta)
+ function derive_beta(gamma_not_reduced) -> beta_not_reduced {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+
+ // beta
+ mstore(mPtr, FS_BETA) // "beta"
+ mstore(add(mPtr, 0x20), gamma_not_reduced)
+ let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1c), 0x24, mPtr, 0x20) //0x1b -> 000.."gamma"
+ if iszero(l_success) { error_verify() }
+ beta_not_reduced := mload(mPtr)
+ mstore(add(state, STATE_BETA), mod(beta_not_reduced, R_MOD))
+ }
+
+ /// derive alpha as sha256
+ /// @param aproof pointer to the proof object
+ /// @param beta_not_reduced the previous challenge (beta) not reduced
+ /// @return alpha_not_reduced the next challenge, alpha, not reduced
+ /// @notice the transcript consists of the previous challenge (beta)
+ /// not reduced, the commitments to the wires associated to the QCP_i,
+ /// and the commitment to the grand product polynomial
+ function derive_alpha(aproof, beta_not_reduced) -> alpha_not_reduced {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+ let full_size := 0x65 // size("alpha") + 0x20 (previous challenge)
+
+ // alpha
+ mstore(mPtr, FS_ALPHA) // "alpha"
+ let _mPtr := add(mPtr, 0x20)
+ mstore(_mPtr, beta_not_reduced)
+ _mPtr := add(_mPtr, 0x20)
+
+ // Bsb22Commitments
+ let proof_bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
+ let size_bsb_commitments := mul(0x40, VK_NB_CUSTOM_GATES)
+ calldatacopy(_mPtr, proof_bsb_commitments, size_bsb_commitments)
+ _mPtr := add(_mPtr, size_bsb_commitments)
+ full_size := add(full_size, size_bsb_commitments)
+
+ // [Z], the commitment to the grand product polynomial
+ calldatacopy(_mPtr, add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X), 0x40)
+ let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), full_size, mPtr, 0x20)
+ if iszero(l_success) { error_verify() }
+
+ alpha_not_reduced := mload(mPtr)
+ mstore(add(state, STATE_ALPHA), mod(alpha_not_reduced, R_MOD))
+ }
+
+ /// derive zeta as sha256
+ /// @param aproof pointer to the proof object
+ /// @param alpha_not_reduced the previous challenge (alpha) not reduced
+ /// The transcript consists of the previous challenge and the commitment to
+ /// the quotient polynomial h.
+ function derive_zeta(aproof, alpha_not_reduced) {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+
+ // zeta
+ mstore(mPtr, FS_ZETA) // "zeta"
+ mstore(add(mPtr, 0x20), alpha_not_reduced)
+ calldatacopy(add(mPtr, 0x40), add(aproof, PROOF_H_0_COM_X), 0xc0)
+ let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1c), 0xe4, mPtr, 0x20)
+ if iszero(l_success) { error_verify() }
+ let zeta_not_reduced := mload(mPtr)
+ mstore(add(state, STATE_ZETA), mod(zeta_not_reduced, R_MOD))
+ }
+ // END challenges -------------------------------------------------
+
+ // BEGINNING compute_pi -------------------------------------------------
+
+ /// sum_pi_wo_api_commit computes the public inputs contributions,
+ /// except for the public inputs coming from the custom gate
+ /// @param ins pointer to the public inputs
+ /// @param n number of public inputs
+ /// @param mPtr free memory
+ /// @return pi_wo_commit public inputs contribution (except the public inputs coming from the custom gate)
+ function sum_pi_wo_api_commit(ins, n, mPtr) -> pi_wo_commit {
+ let state := mload(0x40)
+ let z := mload(add(state, STATE_ZETA))
+ let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
+
+ let li := mPtr
+ batch_compute_lagranges_at_z(z, zpnmo, n, li)
+
+ let tmp := 0
+ for { let i := 0 } lt(i, n) { i := add(i, 1) } {
+ tmp := mulmod(mload(li), calldataload(ins), R_MOD)
+ pi_wo_commit := addmod(pi_wo_commit, tmp, R_MOD)
+ li := add(li, 0x20)
+ ins := add(ins, 0x20)
+ }
+ }
+
+ /// batch_compute_lagranges_at_z computes [L_0(z), .., L_{n-1}(z)]
+ /// @param z point at which the Lagranges are evaluated
+ /// @param zpnmo ζⁿ-1
+ /// @param n_pub number of public inputs (number of Lagranges to compute)
+ /// @param mPtr pointer to which the results are stored
+ function batch_compute_lagranges_at_z(z, zpnmo, n_pub, mPtr) {
+ let zn := mulmod(zpnmo, VK_INV_DOMAIN_SIZE, R_MOD) // 1/n * (ζⁿ - 1)
+
+ let _w := 1
+ let _mPtr := mPtr
+ for { let i := 0 } lt(i, n_pub) { i := add(i, 1) } {
+ mstore(_mPtr, addmod(z, sub(R_MOD, _w), R_MOD))
+ _w := mulmod(_w, VK_OMEGA, R_MOD)
+ _mPtr := add(_mPtr, 0x20)
+ }
+ batch_invert(mPtr, n_pub, _mPtr)
+ _mPtr := mPtr
+ _w := 1
+ for { let i := 0 } lt(i, n_pub) { i := add(i, 1) } {
+ mstore(_mPtr, mulmod(mulmod(mload(_mPtr), zn, R_MOD), _w, R_MOD))
+ _mPtr := add(_mPtr, 0x20)
+ _w := mulmod(_w, VK_OMEGA, R_MOD)
+ }
+ }
+
+ /// @notice Montgomery trick for batch inversion mod R_MOD
+ /// @param ins pointer to the data to batch invert
+ /// @param number of elements to batch invert
+ /// @param mPtr free memory
+ function batch_invert(ins, nb_ins, mPtr) {
+ mstore(mPtr, 1)
+ let offset := 0
+ for { let i := 0 } lt(i, nb_ins) { i := add(i, 1) } {
+ let prev := mload(add(mPtr, offset))
+ let cur := mload(add(ins, offset))
+ cur := mulmod(prev, cur, R_MOD)
+ offset := add(offset, 0x20)
+ mstore(add(mPtr, offset), cur)
+ }
+ ins := add(ins, sub(offset, 0x20))
+ mPtr := add(mPtr, offset)
+ let inv := pow(mload(mPtr), sub(R_MOD, 2), add(mPtr, 0x20))
+ for { let i := 0 } lt(i, nb_ins) { i := add(i, 1) } {
+ mPtr := sub(mPtr, 0x20)
+ let tmp := mload(ins)
+ let cur := mulmod(inv, mload(mPtr), R_MOD)
+ mstore(ins, cur)
+ inv := mulmod(inv, tmp, R_MOD)
+ ins := sub(ins, 0x20)
+ }
+ }
+
+ /// Public inputs (the ones coming from the custom gate) contribution
+ /// @param aproof pointer to the proof
+ /// @param nb_public_inputs number of public inputs
+ /// @param mPtr pointer to free memory
+ /// @return pi_commit custom gate public inputs contribution
+ function sum_pi_commit(aproof, nb_public_inputs, mPtr) -> pi_commit {
+ let state := mload(0x40)
+ let z := mload(add(state, STATE_ZETA))
+ let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
+
+ let p := add(aproof, PROOF_BSB_COMMITMENTS)
+
+ let h_fr, ith_lagrange
+
+ h_fr := hash_fr(calldataload(p), calldataload(add(p, 0x20)), mPtr)
+ ith_lagrange :=
+ compute_ith_lagrange_at_z(
+ z, zpnmo, add(nb_public_inputs, VK_INDEX_COMMIT_API_0), mPtr
+ )
+ pi_commit := addmod(pi_commit, mulmod(h_fr, ith_lagrange, R_MOD), R_MOD)
+ }
+
+ /// Computes L_i(zeta) = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ) where:
+ /// @param z zeta
+ /// @param zpmno ζⁿ-1
+ /// @param i i-th lagrange
+ /// @param mPtr free memory
+ /// @return res = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ)
+ function compute_ith_lagrange_at_z(z, zpnmo, i, mPtr) -> res {
+ let w := pow(VK_OMEGA, i, mPtr) // w**i
+ i := addmod(z, sub(R_MOD, w), R_MOD) // z-w**i
+ w := mulmod(w, VK_INV_DOMAIN_SIZE, R_MOD) // w**i/n
+ i := pow(i, sub(R_MOD, 2), mPtr) // (z-w**i)**-1
+ w := mulmod(w, i, R_MOD) // w**i/n*(z-w)**-1
+ res := mulmod(w, zpnmo, R_MOD)
+ }
+
+ /// @dev https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-06#section-5.2
+ /// @param x x coordinate of a point on Bn254(𝔽_p)
+ /// @param y y coordinate of a point on Bn254(𝔽_p)
+ /// @param mPtr free memory
+ /// @return res an element mod R_MOD
+ function hash_fr(x, y, mPtr) -> res {
+ // [0x00, .. , 0x00 || x, y, || 0, 48, 0, dst, HASH_FR_SIZE_DOMAIN]
+ // <- 64 bytes -> <-64b -> <- 1 bytes each ->
+
+ // [0x00, .., 0x00] 64 bytes of zero
+ mstore(mPtr, HASH_FR_ZERO_UINT256)
+ mstore(add(mPtr, 0x20), HASH_FR_ZERO_UINT256)
+
+ // msg = x || y , both on 32 bytes
+ mstore(add(mPtr, 0x40), x)
+ mstore(add(mPtr, 0x60), y)
+
+ // 0 || 48 || 0 all on 1 byte
+ mstore8(add(mPtr, 0x80), 0)
+ mstore8(add(mPtr, 0x81), HASH_FR_LEN_IN_BYTES)
+ mstore8(add(mPtr, 0x82), 0)
+
+ // "BSB22-Plonk" = [42, 53, 42, 32, 32, 2d, 50, 6c, 6f, 6e, 6b,]
+ mstore8(add(mPtr, 0x83), 0x42)
+ mstore8(add(mPtr, 0x84), 0x53)
+ mstore8(add(mPtr, 0x85), 0x42)
+ mstore8(add(mPtr, 0x86), 0x32)
+ mstore8(add(mPtr, 0x87), 0x32)
+ mstore8(add(mPtr, 0x88), 0x2d)
+ mstore8(add(mPtr, 0x89), 0x50)
+ mstore8(add(mPtr, 0x8a), 0x6c)
+ mstore8(add(mPtr, 0x8b), 0x6f)
+ mstore8(add(mPtr, 0x8c), 0x6e)
+ mstore8(add(mPtr, 0x8d), 0x6b)
+
+ // size domain
+ mstore8(add(mPtr, 0x8e), HASH_FR_SIZE_DOMAIN)
+
+ let l_success := staticcall(gas(), SHA2, mPtr, 0x8f, mPtr, 0x20)
+ if iszero(l_success) { error_verify() }
+
+ let b0 := mload(mPtr)
+
+ // [b0 || one || dst || HASH_FR_SIZE_DOMAIN]
+ // <-64bytes -> <- 1 byte each ->
+ mstore8(add(mPtr, 0x20), HASH_FR_ONE) // 1
+
+ mstore8(add(mPtr, 0x21), 0x42) // dst
+ mstore8(add(mPtr, 0x22), 0x53)
+ mstore8(add(mPtr, 0x23), 0x42)
+ mstore8(add(mPtr, 0x24), 0x32)
+ mstore8(add(mPtr, 0x25), 0x32)
+ mstore8(add(mPtr, 0x26), 0x2d)
+ mstore8(add(mPtr, 0x27), 0x50)
+ mstore8(add(mPtr, 0x28), 0x6c)
+ mstore8(add(mPtr, 0x29), 0x6f)
+ mstore8(add(mPtr, 0x2a), 0x6e)
+ mstore8(add(mPtr, 0x2b), 0x6b)
+
+ mstore8(add(mPtr, 0x2c), HASH_FR_SIZE_DOMAIN) // size domain
+ l_success := staticcall(gas(), SHA2, mPtr, 0x2d, mPtr, 0x20)
+ if iszero(l_success) { error_verify() }
+
+ // b1 is located at mPtr. We store b2 at add(mPtr, 0x20)
+
+ // [b0^b1 || two || dst || HASH_FR_SIZE_DOMAIN]
+ // <-64bytes -> <- 1 byte each ->
+ mstore(add(mPtr, 0x20), xor(mload(mPtr), b0))
+ mstore8(add(mPtr, 0x40), HASH_FR_TWO)
+
+ mstore8(add(mPtr, 0x41), 0x42) // dst
+ mstore8(add(mPtr, 0x42), 0x53)
+ mstore8(add(mPtr, 0x43), 0x42)
+ mstore8(add(mPtr, 0x44), 0x32)
+ mstore8(add(mPtr, 0x45), 0x32)
+ mstore8(add(mPtr, 0x46), 0x2d)
+ mstore8(add(mPtr, 0x47), 0x50)
+ mstore8(add(mPtr, 0x48), 0x6c)
+ mstore8(add(mPtr, 0x49), 0x6f)
+ mstore8(add(mPtr, 0x4a), 0x6e)
+ mstore8(add(mPtr, 0x4b), 0x6b)
+
+ mstore8(add(mPtr, 0x4c), HASH_FR_SIZE_DOMAIN) // size domain
+
+ let offset := add(mPtr, 0x20)
+ l_success := staticcall(gas(), SHA2, offset, 0x2d, offset, 0x20)
+ if iszero(l_success) { error_verify() }
+
+ // at this point we have mPtr = [ b1 || b2] where b1 is on 32byes and b2 in 16bytes.
+ // we interpret it as a big integer mod r in big endian (similar to regular decimal notation)
+ // the result is then 2**(8*16)*mPtr[:32] + mPtr[32:48]
+ res := mulmod(mload(mPtr), HASH_FR_BB, R_MOD) // <- res = 2**128 * mPtr[:32]
+ let b1 := shr(128, mload(add(mPtr, 0x20))) // b1 <- [0, 0, .., 0 || b2[:16] ]
+ res := addmod(res, b1, R_MOD)
+ }
+
+ // END compute_pi -------------------------------------------------
+
+ /// @notice compute α² * 1/n * (ζ{n}-1)/(ζ - 1) where
+ /// * α = challenge derived in derive_gamma_beta_alpha_zeta
+ /// * n = vk_domain_size
+ /// * ω = vk_omega (generator of the multiplicative cyclic group of order n in (ℤ/rℤ)*)
+ /// * ζ = zeta (challenge derived with Fiat Shamir)
+ function compute_alpha_square_lagrange_0() {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+
+ let res := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
+ let den := addmod(mload(add(state, STATE_ZETA)), sub(R_MOD, 1), R_MOD)
+ den := pow(den, sub(R_MOD, 2), mPtr)
+ den := mulmod(den, VK_INV_DOMAIN_SIZE, R_MOD)
+ res := mulmod(den, res, R_MOD)
+
+ let l_alpha := mload(add(state, STATE_ALPHA))
+ res := mulmod(res, l_alpha, R_MOD)
+ res := mulmod(res, l_alpha, R_MOD)
+ mstore(add(state, STATE_ALPHA_SQUARE_LAGRANGE_0), res)
+ }
+
+ /// @notice follows alg. p.13 of https://eprint.iacr.org/2019/953.pdf
+ /// with t₁ = t₂ = 1, and the proofs are ([digest] + [quotient] +purported evaluation):
+ /// * [state_folded_state_digests], [proof_batch_opening_at_zeta_x], state_folded_evals
+ /// * [proof_grand_product_commitment], [proof_opening_at_zeta_omega_x], [proof_grand_product_at_zeta_omega]
+ /// @param aproof pointer to the proof
+ function batch_verify_multi_points(aproof) {
+ let state := mload(0x40)
+ let mPtr := add(state, STATE_LAST_MEM)
+
+ // derive a random number. As there is no random generator, we
+ // do an FS like challenge derivation, depending on both digests and
+ // ζ to ensure that the prover cannot control the random number.
+ // Note: adding the other point ζω is not needed, as ω is known beforehand.
+ mstore(mPtr, mload(add(state, STATE_FOLDED_DIGESTS_X)))
+ mstore(add(mPtr, 0x20), mload(add(state, STATE_FOLDED_DIGESTS_Y)))
+ mstore(add(mPtr, 0x40), calldataload(add(aproof, PROOF_BATCH_OPENING_AT_ZETA_X)))
+ mstore(add(mPtr, 0x60), calldataload(add(aproof, PROOF_BATCH_OPENING_AT_ZETA_Y)))
+ mstore(add(mPtr, 0x80), calldataload(add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X)))
+ mstore(add(mPtr, 0xa0), calldataload(add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_Y)))
+ mstore(add(mPtr, 0xc0), calldataload(add(aproof, PROOF_OPENING_AT_ZETA_OMEGA_X)))
+ mstore(add(mPtr, 0xe0), calldataload(add(aproof, PROOF_OPENING_AT_ZETA_OMEGA_Y)))
+ mstore(add(mPtr, 0x100), mload(add(state, STATE_ZETA)))
+ mstore(add(mPtr, 0x120), mload(add(state, STATE_GAMMA_KZG)))
+ let random := staticcall(gas(), SHA2, mPtr, 0x140, mPtr, 0x20)
+ if iszero(random) { error_random_generation() }
+ random := mod(mload(mPtr), R_MOD) // use the same variable as we are one variable away from getting stack-too-deep error...
+
+ let folded_quotients := mPtr
+ mPtr := add(folded_quotients, 0x40)
+ mstore(folded_quotients, calldataload(add(aproof, PROOF_BATCH_OPENING_AT_ZETA_X)))
+ mstore(
+ add(folded_quotients, 0x20),
+ calldataload(add(aproof, PROOF_BATCH_OPENING_AT_ZETA_Y))
+ )
+ point_acc_mul_calldata(
+ folded_quotients, add(aproof, PROOF_OPENING_AT_ZETA_OMEGA_X), random, mPtr
+ )
+
+ let folded_digests := add(state, STATE_FOLDED_DIGESTS_X)
+ point_acc_mul_calldata(
+ folded_digests, add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X), random, mPtr
+ )
+
+ let folded_evals := add(state, STATE_FOLDED_CLAIMED_VALUES)
+ fr_acc_mul_calldata(
+ folded_evals, add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA), random
+ )
+
+ let folded_evals_commit := mPtr
+ mPtr := add(folded_evals_commit, 0x40)
+ mstore(folded_evals_commit, G1_SRS_X)
+ mstore(add(folded_evals_commit, 0x20), G1_SRS_Y)
+ mstore(add(folded_evals_commit, 0x40), mload(folded_evals))
+ let check_staticcall :=
+ staticcall(gas(), 7, folded_evals_commit, 0x60, folded_evals_commit, 0x40)
+ if iszero(check_staticcall) { error_verify() }
+
+ let folded_evals_commit_y := add(folded_evals_commit, 0x20)
+ mstore(folded_evals_commit_y, sub(P_MOD, mload(folded_evals_commit_y)))
+ point_add(folded_digests, folded_digests, folded_evals_commit, mPtr)
+
+ let folded_points_quotients := mPtr
+ mPtr := add(mPtr, 0x40)
+ point_mul_calldata(
+ folded_points_quotients,
+ add(aproof, PROOF_BATCH_OPENING_AT_ZETA_X),
+ mload(add(state, STATE_ZETA)),
+ mPtr
+ )
+ let zeta_omega := mulmod(mload(add(state, STATE_ZETA)), VK_OMEGA, R_MOD)
+ random := mulmod(random, zeta_omega, R_MOD)
+ point_acc_mul_calldata(
+ folded_points_quotients,
+ add(aproof, PROOF_OPENING_AT_ZETA_OMEGA_X),
+ random,
+ mPtr
+ )
+
+ point_add(folded_digests, folded_digests, folded_points_quotients, mPtr)
+
+ let folded_quotients_y := add(folded_quotients, 0x20)
+ mstore(folded_quotients_y, sub(P_MOD, mload(folded_quotients_y)))
+
+ mstore(mPtr, mload(folded_digests))
+
+ mstore(add(mPtr, 0x20), mload(add(folded_digests, 0x20)))
+ mstore(add(mPtr, 0x40), G2_SRS_0_X_0) // the 4 lines are the canonical G2 point on BN254
+ mstore(add(mPtr, 0x60), G2_SRS_0_X_1)
+ mstore(add(mPtr, 0x80), G2_SRS_0_Y_0)
+ mstore(add(mPtr, 0xa0), G2_SRS_0_Y_1)
+ mstore(add(mPtr, 0xc0), mload(folded_quotients))
+ mstore(add(mPtr, 0xe0), mload(add(folded_quotients, 0x20)))
+ mstore(add(mPtr, 0x100), G2_SRS_1_X_0)
+ mstore(add(mPtr, 0x120), G2_SRS_1_X_1)
+ mstore(add(mPtr, 0x140), G2_SRS_1_Y_0)
+ mstore(add(mPtr, 0x160), G2_SRS_1_Y_1)
+ check_pairing_kzg(mPtr)
+ }
+
+ /// @notice check_pairing_kzg checks the result of the final pairing product of the batched
+ /// kzg verification. The purpose of this function is to avoid exhausting the stack
+ /// in the function batch_verify_multi_points.
+ /// @param mPtr pointer storing the tuple of pairs
+ function check_pairing_kzg(mPtr) {
+ let state := mload(0x40)
+
+ let l_success := staticcall(gas(), 8, mPtr, 0x180, 0x00, 0x20)
+ if iszero(l_success) { error_pairing() }
+ let res_pairing := mload(0x00)
+ mstore(add(state, STATE_SUCCESS), res_pairing)
+ }
+
+ /// @notice Fold the opening proofs at ζ:
+ /// * at state+state_folded_digest we store: [Linearised_polynomial]+γ[L] + γ²[R] + γ³[O] + γ⁴[S₁] +γ⁵[S₂] + ∑ᵢγ⁵⁺ⁱ[Pi_{i}]
+ /// * at state+state_folded_claimed_values we store: Linearised_polynomial(ζ)+γL(ζ) + γ²R(ζ)+ γ³O(ζ) + γ⁴S₁(ζ) +γ⁵S₂(ζ) + ∑ᵢγ⁵⁺ⁱPi_{i}(ζ)
+ /// @param aproof pointer to the proof
+ /// acc_gamma stores the γⁱ
+ function fold_state(aproof) {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+ let mPtr20 := add(mPtr, 0x20)
+ let mPtr40 := add(mPtr, 0x40)
+
+ let l_gamma_kzg := mload(add(state, STATE_GAMMA_KZG))
+ let acc_gamma := l_gamma_kzg
+ let state_folded_digests := add(state, STATE_FOLDED_DIGESTS_X)
+
+ mstore(state_folded_digests, mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
+ mstore(
+ add(state, STATE_FOLDED_DIGESTS_Y),
+ mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y))
+ )
+ mstore(
+ add(state, STATE_FOLDED_CLAIMED_VALUES),
+ mload(add(state, STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA))
+ )
+
+ point_acc_mul_calldata(
+ state_folded_digests, add(aproof, PROOF_L_COM_X), acc_gamma, mPtr
+ )
+ fr_acc_mul_calldata(
+ add(state, STATE_FOLDED_CLAIMED_VALUES), add(aproof, PROOF_L_AT_ZETA), acc_gamma
+ )
+
+ acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
+ point_acc_mul_calldata(
+ state_folded_digests, add(aproof, PROOF_R_COM_X), acc_gamma, mPtr
+ )
+ fr_acc_mul_calldata(
+ add(state, STATE_FOLDED_CLAIMED_VALUES), add(aproof, PROOF_R_AT_ZETA), acc_gamma
+ )
+
+ acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
+ point_acc_mul_calldata(
+ state_folded_digests, add(aproof, PROOF_O_COM_X), acc_gamma, mPtr
+ )
+ fr_acc_mul_calldata(
+ add(state, STATE_FOLDED_CLAIMED_VALUES), add(aproof, PROOF_O_AT_ZETA), acc_gamma
+ )
+
+ acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
+ mstore(mPtr, VK_S1_COM_X)
+ mstore(mPtr20, VK_S1_COM_Y)
+ point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
+ fr_acc_mul_calldata(
+ add(state, STATE_FOLDED_CLAIMED_VALUES),
+ add(aproof, PROOF_S1_AT_ZETA),
+ acc_gamma
+ )
+
+ acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
+ mstore(mPtr, VK_S2_COM_X)
+ mstore(mPtr20, VK_S2_COM_Y)
+ point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
+ fr_acc_mul_calldata(
+ add(state, STATE_FOLDED_CLAIMED_VALUES),
+ add(aproof, PROOF_S2_AT_ZETA),
+ acc_gamma
+ )
+ let poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
+
+ acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
+ mstore(mPtr, VK_QCP_0_X)
+ mstore(mPtr20, VK_QCP_0_Y)
+ point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
+ fr_acc_mul_calldata(add(state, STATE_FOLDED_CLAIMED_VALUES), poqaz, acc_gamma)
+ poqaz := add(poqaz, 0x20)
+ }
+
+ /// @notice generate the challenge (using Fiat Shamir) to fold the opening proofs
+ /// at ζ.
+ /// The process for deriving γ is the same as in derive_gamma but this time the inputs are
+ /// in this order (the [] means it's a commitment):
+ /// * ζ
+ /// * [Linearised polynomial]
+ /// * [L], [R], [O]
+ /// * [S₁] [S₂]
+ /// * [Pi_{i}] (wires associated to custom gates)
+ /// Then there are the purported evaluations of the previous committed polynomials:
+ /// * Linearised_polynomial(ζ)
+ /// * L(ζ), R(ζ), O(ζ), S₁(ζ), S₂(ζ)
+ /// * Pi_{i}(ζ)
+ /// * Z(ζω)
+ /// @param aproof pointer to the proof
+ function compute_gamma_kzg(aproof) {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+ mstore(mPtr, FS_GAMMA_KZG) // "gamma"
+ mstore(add(mPtr, 0x20), mload(add(state, STATE_ZETA)))
+ mstore(add(mPtr, 0x40), mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
+ mstore(add(mPtr, 0x60), mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y)))
+ calldatacopy(add(mPtr, 0x80), add(aproof, PROOF_L_COM_X), 0xc0)
+ mstore(add(mPtr, 0x140), VK_S1_COM_X)
+ mstore(add(mPtr, 0x160), VK_S1_COM_Y)
+ mstore(add(mPtr, 0x180), VK_S2_COM_X)
+ mstore(add(mPtr, 0x1a0), VK_S2_COM_Y)
+
+ let offset := 0x1c0
+
+ mstore(add(mPtr, offset), VK_QCP_0_X)
+ mstore(add(mPtr, add(offset, 0x20)), VK_QCP_0_Y)
+ offset := add(offset, 0x40)
+ mstore(
+ add(mPtr, offset), mload(add(state, STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA))
+ )
+ mstore(add(mPtr, add(offset, 0x20)), calldataload(add(aproof, PROOF_L_AT_ZETA)))
+ mstore(add(mPtr, add(offset, 0x40)), calldataload(add(aproof, PROOF_R_AT_ZETA)))
+ mstore(add(mPtr, add(offset, 0x60)), calldataload(add(aproof, PROOF_O_AT_ZETA)))
+ mstore(add(mPtr, add(offset, 0x80)), calldataload(add(aproof, PROOF_S1_AT_ZETA)))
+ mstore(add(mPtr, add(offset, 0xa0)), calldataload(add(aproof, PROOF_S2_AT_ZETA)))
+
+ let _mPtr := add(mPtr, add(offset, 0xc0))
+
+ let _poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
+ calldatacopy(_mPtr, _poqaz, mul(VK_NB_CUSTOM_GATES, 0x20))
+ _mPtr := add(_mPtr, mul(VK_NB_CUSTOM_GATES, 0x20))
+
+ mstore(_mPtr, calldataload(add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)))
+
+ let start_input := 0x1b // 00.."gamma"
+ let size_input := add(0x14, mul(VK_NB_CUSTOM_GATES, 3)) // number of 32bytes elmts = 0x14 (zeta+3*6 for the digests+openings) + 3*VK_NB_CUSTOM_GATES (for the commitments of the selectors) + 1 (opening of Z at ζω)
+ size_input := add(0x5, mul(size_input, 0x20)) // size in bytes: 15*32 bytes + 5 bytes for gamma
+ let check_staticcall :=
+ staticcall(
+ gas(),
+ SHA2,
+ add(mPtr, start_input),
+ size_input,
+ add(state, STATE_GAMMA_KZG),
+ 0x20
+ )
+ if iszero(check_staticcall) { error_verify() }
+ mstore(add(state, STATE_GAMMA_KZG), mod(mload(add(state, STATE_GAMMA_KZG)), R_MOD))
+ }
+
+ function compute_commitment_linearised_polynomial_ec(aproof, s1, s2) {
+ let state := mload(0x40)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+
+ mstore(mPtr, VK_QL_COM_X)
+ mstore(add(mPtr, 0x20), VK_QL_COM_Y)
+ point_mul(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ mPtr,
+ calldataload(add(aproof, PROOF_L_AT_ZETA)),
+ add(mPtr, 0x40)
+ )
+
+ mstore(mPtr, VK_QR_COM_X)
+ mstore(add(mPtr, 0x20), VK_QR_COM_Y)
+ point_acc_mul(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ mPtr,
+ calldataload(add(aproof, PROOF_R_AT_ZETA)),
+ add(mPtr, 0x40)
+ )
+
+ let rl :=
+ mulmod(
+ calldataload(add(aproof, PROOF_L_AT_ZETA)),
+ calldataload(add(aproof, PROOF_R_AT_ZETA)),
+ R_MOD
+ )
+ mstore(mPtr, VK_QM_COM_X)
+ mstore(add(mPtr, 0x20), VK_QM_COM_Y)
+ point_acc_mul(add(state, STATE_LINEARISED_POLYNOMIAL_X), mPtr, rl, add(mPtr, 0x40))
+
+ mstore(mPtr, VK_QO_COM_X)
+ mstore(add(mPtr, 0x20), VK_QO_COM_Y)
+ point_acc_mul(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ mPtr,
+ calldataload(add(aproof, PROOF_O_AT_ZETA)),
+ add(mPtr, 0x40)
+ )
+
+ mstore(mPtr, VK_QK_COM_X)
+ mstore(add(mPtr, 0x20), VK_QK_COM_Y)
+ point_add(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ mPtr,
+ add(mPtr, 0x40)
+ )
+
+ let qcp_opening_at_zeta := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
+ let bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
+ for { let i := 0 } lt(i, VK_NB_CUSTOM_GATES) { i := add(i, 1) } {
+ mstore(mPtr, calldataload(bsb_commitments))
+ mstore(add(mPtr, 0x20), calldataload(add(bsb_commitments, 0x20)))
+ point_acc_mul(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ mPtr,
+ calldataload(qcp_opening_at_zeta),
+ add(mPtr, 0x40)
+ )
+ qcp_opening_at_zeta := add(qcp_opening_at_zeta, 0x20)
+ bsb_commitments := add(bsb_commitments, 0x40)
+ }
+
+ mstore(mPtr, VK_S3_COM_X)
+ mstore(add(mPtr, 0x20), VK_S3_COM_Y)
+ point_acc_mul(add(state, STATE_LINEARISED_POLYNOMIAL_X), mPtr, s1, add(mPtr, 0x40))
+
+ mstore(mPtr, calldataload(add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X)))
+ mstore(add(mPtr, 0x20), calldataload(add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_Y)))
+ point_acc_mul(add(state, STATE_LINEARISED_POLYNOMIAL_X), mPtr, s2, add(mPtr, 0x40))
+
+ point_add(
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ add(state, STATE_LINEARISED_POLYNOMIAL_X),
+ add(state, STATE_FOLDED_H_X),
+ mPtr
+ )
+ }
+
+ /// @notice Compute the commitment to the linearized polynomial equal to
+ /// L(ζ)[Qₗ]+r(ζ)[Qᵣ]+R(ζ)L(ζ)[Qₘ]+O(ζ)[Qₒ]+[Qₖ]+Σᵢqc'ᵢ(ζ)[BsbCommitmentᵢ] +
+ /// α*( Z(μζ)(L(ζ)+β*S₁(ζ)+γ)*(R(ζ)+β*S₂(ζ)+γ)[S₃]-[Z](L(ζ)+β*id_{1}(ζ)+γ)*(R(ζ)+β*id_{2}(ζ)+γ)*(O(ζ)+β*id_{3}(ζ)+γ) ) +
+ /// α²*L₁(ζ)[Z] - Z_{H}(ζ)*(([H₀] + ζᵐ⁺²*[H₁] + ζ²⁽ᵐ⁺²⁾*[H₂])
+ /// where
+ /// * id_1 = id, id_2 = vk_coset_shift*id, id_3 = vk_coset_shift^{2}*id
+ /// * the [] means that it's a commitment (i.e. a point on Bn254(F_p))
+ /// * Z_{H}(ζ) = ζ^n-1
+ /// @param aproof pointer to the proof
+ function compute_commitment_linearised_polynomial(aproof) {
+ let state := mload(0x40)
+ let l_beta := mload(add(state, STATE_BETA))
+ let l_gamma := mload(add(state, STATE_GAMMA))
+ let l_zeta := mload(add(state, STATE_ZETA))
+ let l_alpha := mload(add(state, STATE_ALPHA))
+
+ let u :=
+ mulmod(calldataload(add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)), l_beta, R_MOD)
+ let v := mulmod(l_beta, calldataload(add(aproof, PROOF_S1_AT_ZETA)), R_MOD)
+ v := addmod(v, calldataload(add(aproof, PROOF_L_AT_ZETA)), R_MOD)
+ v := addmod(v, l_gamma, R_MOD)
+
+ let w := mulmod(l_beta, calldataload(add(aproof, PROOF_S2_AT_ZETA)), R_MOD)
+ w := addmod(w, calldataload(add(aproof, PROOF_R_AT_ZETA)), R_MOD)
+ w := addmod(w, l_gamma, R_MOD)
+
+ let s1 := mulmod(u, v, R_MOD)
+ s1 := mulmod(s1, w, R_MOD)
+ s1 := mulmod(s1, l_alpha, R_MOD)
+
+ let coset_square := mulmod(VK_COSET_SHIFT, VK_COSET_SHIFT, R_MOD)
+ let betazeta := mulmod(l_beta, l_zeta, R_MOD)
+ u := addmod(betazeta, calldataload(add(aproof, PROOF_L_AT_ZETA)), R_MOD)
+ u := addmod(u, l_gamma, R_MOD)
+
+ v := mulmod(betazeta, VK_COSET_SHIFT, R_MOD)
+ v := addmod(v, calldataload(add(aproof, PROOF_R_AT_ZETA)), R_MOD)
+ v := addmod(v, l_gamma, R_MOD)
+
+ w := mulmod(betazeta, coset_square, R_MOD)
+ w := addmod(w, calldataload(add(aproof, PROOF_O_AT_ZETA)), R_MOD)
+ w := addmod(w, l_gamma, R_MOD)
+
+ let s2 := mulmod(u, v, R_MOD)
+ s2 := mulmod(s2, w, R_MOD)
+ s2 := sub(R_MOD, s2)
+ s2 := mulmod(s2, l_alpha, R_MOD)
+ s2 := addmod(s2, mload(add(state, STATE_ALPHA_SQUARE_LAGRANGE_0)), R_MOD)
+
+ // at this stage:
+ // * s₁ = α*Z(μζ)(l(ζ)+β*s₁(ζ)+γ)*(r(ζ)+β*s₂(ζ)+γ)*β
+ // * s₂ = -α*(l(ζ)+β*ζ+γ)*(r(ζ)+β*u*ζ+γ)*(o(ζ)+β*u²*ζ+γ) + α²*L₁(ζ)
+
+ compute_commitment_linearised_polynomial_ec(aproof, s1, s2)
+ }
+
+ /// @notice compute -z_h(ζ)*([H₁] + ζⁿ⁺²[H₂] + ζ²⁽ⁿ⁺²⁾[H₃]) and store the result at
+ /// state + state_folded_h
+ /// @param aproof pointer to the proof
+ function fold_h(aproof) {
+ let state := mload(0x40)
+ let n_plus_two := add(VK_DOMAIN_SIZE, 2)
+ let mPtr := add(mload(0x40), STATE_LAST_MEM)
+ let zeta_power_n_plus_two := pow(mload(add(state, STATE_ZETA)), n_plus_two, mPtr)
+ point_mul_calldata(
+ add(state, STATE_FOLDED_H_X),
+ add(aproof, PROOF_H_2_COM_X),
+ zeta_power_n_plus_two,
+ mPtr
+ )
+ point_add_calldata(
+ add(state, STATE_FOLDED_H_X),
+ add(state, STATE_FOLDED_H_X),
+ add(aproof, PROOF_H_1_COM_X),
+ mPtr
+ )
+ point_mul(
+ add(state, STATE_FOLDED_H_X),
+ add(state, STATE_FOLDED_H_X),
+ zeta_power_n_plus_two,
+ mPtr
+ )
+ point_add_calldata(
+ add(state, STATE_FOLDED_H_X),
+ add(state, STATE_FOLDED_H_X),
+ add(aproof, PROOF_H_0_COM_X),
+ mPtr
+ )
+ point_mul(
+ add(state, STATE_FOLDED_H_X),
+ add(state, STATE_FOLDED_H_X),
+ mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE)),
+ mPtr
+ )
+ let folded_h_y := mload(add(state, STATE_FOLDED_H_Y))
+ folded_h_y := sub(P_MOD, folded_h_y)
+ mstore(add(state, STATE_FOLDED_H_Y), folded_h_y)
+ }
+
+ /// @notice check that the opening of the linearised polynomial at zeta is equal to
+ /// - [ PI(ζ) - α²*L₁(ζ) + α(l(ζ)+β*s1(ζ)+γ)(r(ζ)+β*s2(ζ)+γ)(o(ζ)+γ)*z(ωζ) ]
+ /// @param aproof pointer to the proof
+ function compute_opening_linearised_polynomial(aproof) {
+ let state := mload(0x40)
+
+ // (l(ζ)+β*s1(ζ)+γ)
+ let s1
+ s1 :=
+ mulmod(
+ calldataload(add(aproof, PROOF_S1_AT_ZETA)),
+ mload(add(state, STATE_BETA)),
+ R_MOD
+ )
+ s1 := addmod(s1, mload(add(state, STATE_GAMMA)), R_MOD)
+ s1 := addmod(s1, calldataload(add(aproof, PROOF_L_AT_ZETA)), R_MOD)
+
+ // (r(ζ)+β*s2(ζ)+γ)
+ let s2
+ s2 :=
+ mulmod(
+ calldataload(add(aproof, PROOF_S2_AT_ZETA)),
+ mload(add(state, STATE_BETA)),
+ R_MOD
+ )
+ s2 := addmod(s2, mload(add(state, STATE_GAMMA)), R_MOD)
+ s2 := addmod(s2, calldataload(add(aproof, PROOF_R_AT_ZETA)), R_MOD)
+
+ // (o(ζ)+γ)
+ let o
+ o :=
+ addmod(
+ calldataload(add(aproof, PROOF_O_AT_ZETA)),
+ mload(add(state, STATE_GAMMA)),
+ R_MOD
+ )
+
+ // α*Z(μζ)*(l(ζ)+β*s1(ζ)+γ)*(r(ζ)+β*s2(ζ)+γ)*(o(ζ)+γ)
+ s1 := mulmod(s1, s2, R_MOD)
+ s1 := mulmod(s1, o, R_MOD)
+ s1 := mulmod(s1, mload(add(state, STATE_ALPHA)), R_MOD)
+ s1 :=
+ mulmod(s1, calldataload(add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)), R_MOD)
+
+ // PI(ζ) - α²*L₁(ζ) + α(l(ζ)+β*s1(ζ)+γ)(r(ζ)+β*s2(ζ)+γ)(o(ζ)+γ)*z(ωζ)
+ s1 := addmod(s1, mload(add(state, STATE_PI)), R_MOD)
+ s2 := mload(add(state, STATE_ALPHA_SQUARE_LAGRANGE_0))
+ s2 := sub(R_MOD, s2)
+ s1 := addmod(s1, s2, R_MOD)
+ s1 := sub(R_MOD, s1)
+
+ mstore(add(state, STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA), s1)
+ }
+
+ // BEGINNING utils math functions -------------------------------------------------
+
+ /// @param dst pointer storing the result
+ /// @param p pointer to the first point
+ /// @param q pointer to the second point
+ /// @param mPtr pointer to free memory
+ function point_add(dst, p, q, mPtr) {
+ mstore(mPtr, mload(p))
+ mstore(add(mPtr, 0x20), mload(add(p, 0x20)))
+ mstore(add(mPtr, 0x40), mload(q))
+ mstore(add(mPtr, 0x60), mload(add(q, 0x20)))
+ let l_success := staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40)
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @param dst pointer storing the result
+ /// @param p pointer to the first point (calldata)
+ /// @param q pointer to the second point (calladata)
+ /// @param mPtr pointer to free memory
+ function point_add_calldata(dst, p, q, mPtr) {
+ mstore(mPtr, mload(p))
+ mstore(add(mPtr, 0x20), mload(add(p, 0x20)))
+ mstore(add(mPtr, 0x40), calldataload(q))
+ mstore(add(mPtr, 0x60), calldataload(add(q, 0x20)))
+ let l_success := staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40)
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @parma dst pointer storing the result
+ /// @param src pointer to a point on Bn254(𝔽_p)
+ /// @param s scalar
+ /// @param mPtr free memory
+ function point_mul(dst, src, s, mPtr) {
+ mstore(mPtr, mload(src))
+ mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
+ mstore(add(mPtr, 0x40), s)
+ let l_success := staticcall(gas(), EC_MUL, mPtr, 0x60, dst, 0x40)
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @parma dst pointer storing the result
+ /// @param src pointer to a point on Bn254(𝔽_p) on calldata
+ /// @param s scalar
+ /// @param mPtr free memory
+ function point_mul_calldata(dst, src, s, mPtr) {
+ mstore(mPtr, calldataload(src))
+ mstore(add(mPtr, 0x20), calldataload(add(src, 0x20)))
+ mstore(add(mPtr, 0x40), s)
+ let l_success := staticcall(gas(), EC_MUL, mPtr, 0x60, dst, 0x40)
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @notice dst <- dst + [s]src (Elliptic curve)
+ /// @param dst pointer accumulator point storing the result
+ /// @param src pointer to the point to multiply and add
+ /// @param s scalar
+ /// @param mPtr free memory
+ function point_acc_mul(dst, src, s, mPtr) {
+ mstore(mPtr, mload(src))
+ mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
+ mstore(add(mPtr, 0x40), s)
+ let l_success := staticcall(gas(), 7, mPtr, 0x60, mPtr, 0x40)
+ mstore(add(mPtr, 0x40), mload(dst))
+ mstore(add(mPtr, 0x60), mload(add(dst, 0x20)))
+ l_success := and(l_success, staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40))
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @notice dst <- dst + [s]src (Elliptic curve)
+ /// @param dst pointer accumulator point storing the result
+ /// @param src pointer to the point to multiply and add (on calldata)
+ /// @param s scalar
+ /// @mPtr free memory
+ function point_acc_mul_calldata(dst, src, s, mPtr) {
+ mstore(mPtr, calldataload(src))
+ mstore(add(mPtr, 0x20), calldataload(add(src, 0x20)))
+ mstore(add(mPtr, 0x40), s)
+ let l_success := staticcall(gas(), 7, mPtr, 0x60, mPtr, 0x40)
+ mstore(add(mPtr, 0x40), mload(dst))
+ mstore(add(mPtr, 0x60), mload(add(dst, 0x20)))
+ l_success := and(l_success, staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40))
+ if iszero(l_success) { error_ec_op() }
+ }
+
+ /// @notice dst <- dst + src*s (Fr) dst,src are addresses, s is a value
+ /// @param dst pointer storing the result
+ /// @param src pointer to the scalar to multiply and add (on calldata)
+ /// @param s scalar
+ function fr_acc_mul_calldata(dst, src, s) {
+ let tmp := mulmod(calldataload(src), s, R_MOD)
+ mstore(dst, addmod(mload(dst), tmp, R_MOD))
+ }
+
+ /// @param x element to exponentiate
+ /// @param e exponent
+ /// @param mPtr free memory
+ /// @return res x ** e mod r
+ function pow(x, e, mPtr) -> res {
+ mstore(mPtr, 0x20)
+ mstore(add(mPtr, 0x20), 0x20)
+ mstore(add(mPtr, 0x40), 0x20)
+ mstore(add(mPtr, 0x60), x)
+ mstore(add(mPtr, 0x80), e)
+ mstore(add(mPtr, 0xa0), R_MOD)
+ let check_staticcall := staticcall(gas(), MOD_EXP, mPtr, 0xc0, mPtr, 0x20)
+ if eq(check_staticcall, 0) { error_mod_exp() }
+ res := mload(mPtr)
+ }
+ }
+ }
+}
diff --git a/contracts/verifiers/v4.0.0-rc.3/SP1VerifierPlonk.sol b/contracts/verifiers/v4.0.0-rc.3/SP1VerifierPlonk.sol
new file mode 100644
index 000000000..69953eec3
--- /dev/null
+++ b/contracts/verifiers/v4.0.0-rc.3/SP1VerifierPlonk.sol
@@ -0,0 +1,62 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+
+import {ISP1Verifier, ISP1VerifierWithHash} from "../../v2/interfaces/ISP1Verifier.sol";
+import {PlonkVerifier} from "./PlonkVerifier.sol";
+
+/// @title SP1 Verifier
+/// @author Succinct Labs
+/// @notice This contracts implements a solidity verifier for SP1.
+contract SP1VerifierPlonk is PlonkVerifier, ISP1VerifierWithHash {
+ /// @notice Thrown when the verifier selector from this proof does not match the one in this
+ /// verifier. This indicates that this proof was sent to the wrong verifier.
+ /// @param received The verifier selector from the first 4 bytes of the proof.
+ /// @param expected The verifier selector from the first 4 bytes of the VERIFIER_HASH().
+ error WrongVerifierSelector(bytes4 received, bytes4 expected);
+
+ /// @notice Thrown when the proof is invalid.
+ error InvalidProof();
+
+ function VERSION() external pure returns (string memory) {
+ return "v4.0.0-rc.3";
+ }
+
+ /// @inheritdoc ISP1VerifierWithHash
+ function VERIFIER_HASH() public pure returns (bytes32) {
+ return
+ 0x1b34fe11a637737f0c75c88241669dcf9ca3c03713659265b8241f398a2d286d;
+ }
+
+ /// @notice Hashes the public values to a field elements inside Bn254.
+ /// @param publicValues The public values.
+ function hashPublicValues(
+ bytes calldata publicValues
+ ) public pure returns (bytes32) {
+ return sha256(publicValues) & bytes32(uint256((1 << 253) - 1));
+ }
+
+ /// @notice Verifies a proof with given public values and vkey.
+ /// @param programVKey The verification key for the RISC-V program.
+ /// @param publicValues The public values encoded as bytes.
+ /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes.
+ function verifyProof(
+ bytes32 programVKey,
+ bytes calldata publicValues,
+ bytes calldata proofBytes
+ ) external view {
+ bytes4 receivedSelector = bytes4(proofBytes[:4]);
+ bytes4 expectedSelector = bytes4(VERIFIER_HASH());
+ if (receivedSelector != expectedSelector) {
+ revert WrongVerifierSelector(receivedSelector, expectedSelector);
+ }
+
+ bytes32 publicValuesDigest = hashPublicValues(publicValues);
+ uint256[] memory inputs = new uint256[](2);
+ inputs[0] = uint256(programVKey);
+ inputs[1] = uint256(publicValuesDigest);
+ bool success = this.Verify(proofBytes[4:], inputs);
+ if (!success) {
+ revert InvalidProof();
+ }
+ }
+}
diff --git a/deployment/helpers/deployment-helpers.ts b/deployment/helpers/deployment-helpers.ts
index 97318a213..189ddefa7 100644
--- a/deployment/helpers/deployment-helpers.ts
+++ b/deployment/helpers/deployment-helpers.ts
@@ -78,7 +78,7 @@ export async function deployPolygonZkEVMDeployer(
}
export async function create2Deployment(
- polgonZKEVMDeployerContract: PolygonZkEVMDeployer,
+ polygonZKEVMDeployerContract: PolygonZkEVMDeployer,
salt: string,
deployTransaction: string,
dataCall: string | null,
@@ -90,7 +90,7 @@ export async function create2Deployment(
// Precalculate create2 address
const precalculatedAddressDeployed = ethers.getCreate2Address(
- polgonZKEVMDeployerContract.target as string,
+ polygonZKEVMDeployerContract.target as string,
salt,
hashInitCode
);
@@ -104,7 +104,7 @@ export async function create2Deployment(
// Deploy using create2 and call
if (hardcodedGasLimit) {
const populatedTransaction =
- await polgonZKEVMDeployerContract.deployDeterministicAndCall.populateTransaction(
+ await polygonZKEVMDeployerContract.deployDeterministicAndCall.populateTransaction(
amount,
salt,
deployTransaction,
@@ -114,13 +114,13 @@ export async function create2Deployment(
await (await deployer.sendTransaction(populatedTransaction)).wait();
} else {
await (
- await polgonZKEVMDeployerContract.deployDeterministicAndCall(amount, salt, deployTransaction, dataCall)
+ await polygonZKEVMDeployerContract.deployDeterministicAndCall(amount, salt, deployTransaction, dataCall)
).wait();
}
} else {
// Deploy using create2
if (hardcodedGasLimit) {
- const populatedTransaction = await polgonZKEVMDeployerContract.deployDeterministic.populateTransaction(
+ const populatedTransaction = await polygonZKEVMDeployerContract.deployDeterministic.populateTransaction(
amount,
salt,
deployTransaction
@@ -128,7 +128,7 @@ export async function create2Deployment(
populatedTransaction.gasLimit = hardcodedGasLimit;
await (await deployer.sendTransaction(populatedTransaction)).wait();
} else {
- await (await polgonZKEVMDeployerContract.deployDeterministic(amount, salt, deployTransaction)).wait();
+ await (await polygonZKEVMDeployerContract.deployDeterministic(amount, salt, deployTransaction)).wait();
}
}
return [precalculatedAddressDeployed, true];
diff --git a/deployment/testnet/prepareTestnet.ts b/deployment/testnet/prepareTestnet.ts
index 5f208fb87..d8b189d55 100644
--- a/deployment/testnet/prepareTestnet.ts
+++ b/deployment/testnet/prepareTestnet.ts
@@ -23,6 +23,7 @@ const argv = yargs(process.argv.slice(2))
const pathDeployParameters = path.join(__dirname, argv.input);
const deployParameters = require(argv.input);
+const pathCreateRollupParameters = path.join(__dirname, argv.createRollupInput);
const createRollupParameters = require(argv.createRollupInput);
async function main() {
@@ -132,6 +133,24 @@ async function main() {
}
deployParameters.polTokenAddress = polTokenContract.target;
+
+ if (createRollupParameters.gasTokenAddress == "deploy") {
+ /*
+ * Deployment gasToken address
+ * A erc20 is deployed in this testnet in case it's wanted to deploy a rollup that uses this token as the gas token
+ */
+ const gasTokenName = "Gas Token";
+ const gasTokenSymbol = "GAS";
+
+ const gasTokenFactory = await ethers.getContractFactory("ERC20", deployer);
+ const gasTokenContract = await gasTokenFactory.deploy(gasTokenName, gasTokenSymbol);
+ await gasTokenContract.waitForDeployment();
+ createRollupParameters.gasTokenAddress = gasTokenContract.target;
+ console.log("#######################\n");
+ console.log("gas token deployed to:", gasTokenContract.target);
+ fs.writeFileSync(pathCreateRollupParameters, JSON.stringify(createRollupParameters, null, 1));
+ }
+
fs.writeFileSync(pathDeployParameters, JSON.stringify(deployParameters, null, 1));
}
diff --git a/deployment/v2/1_createGenesis.ts b/deployment/v2/1_createGenesis.ts
index 702003af8..45f52dc95 100644
--- a/deployment/v2/1_createGenesis.ts
+++ b/deployment/v2/1_createGenesis.ts
@@ -59,7 +59,7 @@ const zkevmAddressL2 = ethers.ZeroAddress;
async function main() {
// Constant variables
const attemptsDeployProxy = 20;
- const balanceBrige = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits
+ const balanceBridge = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits
let timelockAdminAddress;
let initialZkEVMDeployerOwner;
@@ -75,9 +75,9 @@ async function main() {
let proxyAdminAddress;
let finalProxyAdminAddress;
- let finalTimelockContractAdress;
+ let finalTimelockContractAddress;
- let finalzkEVMDeployerAdress;
+ let finalZkEVMDeployerAddress;
const finalGlobalExitRootL2ProxyAddress = globalExitRootL2Address;
@@ -97,8 +97,8 @@ async function main() {
salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // salt mock
initialZkEVMDeployerOwner = mainnetInitialZkEVMDeployerOwner;
- finalzkEVMDeployerAdress = mainnetZkEVMDeployerAddress;
- finalTimelockContractAdress = mainnetZkEVMTimelockAddress;
+ finalZkEVMDeployerAddress = mainnetZkEVMDeployerAddress;
+ finalTimelockContractAddress = mainnetZkEVMTimelockAddress;
finalProxyAdminAddress = mainnetProxyAdminAddress;
finalBridgeImplAddress = mainnetZkEVMBridgeImplementationAddress;
finalBridgeProxyAddress = mainnetZkEVMBridgeProxyAddress;
@@ -135,7 +135,7 @@ async function main() {
if (isMainnet === false) {
finalDeployer = deployer.address;
finalKeylessDeployer = keylessDeployer;
- finalzkEVMDeployerAdress = zkEVMDeployerContract.target;
+ finalZkEVMDeployerAddress = zkEVMDeployerContract.target;
}
/*
* Deploy Bridge
@@ -163,7 +163,8 @@ async function main() {
}
// Deploy implementation PolygonZkEVMBridge
- const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer);
+ const bridgeContractName = "PolygonZkEVMBridgeV2";
+ const polygonZkEVMBridgeFactory = await ethers.getContractFactory(bridgeContractName, deployer);
const deployTransactionBridge = (await polygonZkEVMBridgeFactory.getDeployTransaction()).data;
// Mandatory to override the gasLimit since the estimation with create are mess up D:
const overrideGasLimit = BigInt(5500000);
@@ -211,14 +212,15 @@ async function main() {
finalBridgeProxyAddress = proxyBridgeAddress;
}
- // Import OZ manifest the deployed contracts, its enough to import just the proyx, the rest are imported automatically ( admin/impl)
+ // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically ( admin/impl)
await upgrades.forceImport(proxyBridgeAddress as string, polygonZkEVMBridgeFactory, "transparent" as any);
/*
*Deployment Global exit root manager
*/
+ const globalExitRootContractName = "PolygonZkEVMGlobalExitRootL2";
const PolygonZkEVMGlobalExitRootL2Factory = await ethers.getContractFactory(
- "PolygonZkEVMGlobalExitRootL2",
+ globalExitRootContractName,
deployer
);
let polygonZkEVMGlobalExitRootL2;
@@ -257,12 +259,12 @@ async function main() {
);
await timelockContract.waitForDeployment();
if (isMainnet === false) {
- finalTimelockContractAdress = timelockContract.target;
+ finalTimelockContractAddress = timelockContract.target;
}
// Transfer ownership of the proxyAdmin to timelock
const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress as string) as ProxyAdmin;
- await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAdress as string)).wait();
+ await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAddress as string)).wait();
// Recreate genesis with the current information:
@@ -272,7 +274,7 @@ async function main() {
contractName: "PolygonZkEVMDeployer",
balance: "0",
nonce: zkEVMDeployerInfo.nonce.toString(),
- address: finalzkEVMDeployerAdress,
+ address: finalZkEVMDeployerAddress,
bytecode: zkEVMDeployerInfo.bytecode,
storage: zkEVMDeployerInfo.storage,
});
@@ -291,7 +293,7 @@ async function main() {
// Bridge implementation
const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress as string);
genesis.push({
- contractName: "PolygonZkEVMBridge implementation",
+ contractName: `${bridgeContractName} implementation`,
balance: "0",
nonce: bridgeImplementationInfo.nonce.toString(),
address: finalBridgeImplAddress,
@@ -306,8 +308,8 @@ async function main() {
bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(finalBridgeImplAddress as string, 32);
genesis.push({
- contractName: "PolygonZkEVMBridge proxy",
- balance: balanceBrige,
+ contractName: `${bridgeContractName} proxy`,
+ balance: balanceBridge,
nonce: bridgeProxyInfo.nonce.toString(),
address: finalBridgeProxyAddress,
bytecode: bridgeProxyInfo.bytecode,
@@ -325,7 +327,7 @@ async function main() {
}
genesis.push({
- contractName: "PolygonZkEVMGlobalExitRootL2 implementation",
+ contractName: `${globalExitRootContractName} implementation`,
balance: "0",
nonce: implGlobalExitRootL2Info.nonce.toString(),
address: finalGlobalExitRootL2ImplAddress,
@@ -343,7 +345,7 @@ async function main() {
);
genesis.push({
- contractName: "PolygonZkEVMGlobalExitRootL2 proxy",
+ contractName: `${globalExitRootContractName} proxy`,
balance: "0",
nonce: proxyGlobalExitRootL2Info.nonce.toString(),
address: finalGlobalExitRootL2ProxyAddress,
@@ -355,7 +357,7 @@ async function main() {
const timelockInfo = await getAddressInfo(timelockContract.target);
/*
- * Since roles are used, most storage are writted in peusdoRandom storage slots
+ * Since roles are used, most storage is written in pseudoRandom storage slots
* bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE");
* bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
* bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
@@ -398,7 +400,7 @@ async function main() {
contractName: "PolygonZkEVMTimelock",
balance: "0",
nonce: timelockInfo.nonce.toString(),
- address: finalTimelockContractAdress,
+ address: finalTimelockContractAddress,
bytecode: timelockInfo.bytecode,
storage: timelockInfo.storage,
});
@@ -483,9 +485,9 @@ async function getAddressInfo(address: string | Addressable) {
if (valueAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
storage[_ADMIN_SLOT] = valueAdminSlot;
}
- const valuImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT);
- if (valuImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
- storage[_IMPLEMENTATION_SLOT] = valuImplementationSlot;
+ const valueImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT);
+ if (valueImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ storage[_IMPLEMENTATION_SLOT] = valueImplementationSlot;
}
return {nonce, bytecode, storage};
diff --git a/deployment/v2/3_deployContracts.ts b/deployment/v2/3_deployContracts.ts
index 3539aeddb..682137107 100644
--- a/deployment/v2/3_deployContracts.ts
+++ b/deployment/v2/3_deployContracts.ts
@@ -342,7 +342,6 @@ async function main() {
for (let i = 0; i < attemptsDeployProxy; i++) {
try {
polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
- initializer: false,
constructorArgs: [precalculateRollupManager, proxyBridgeAddress],
unsafeAllow: ["constructor", "state-variable-immutable"],
});
@@ -419,18 +418,12 @@ async function main() {
PolygonRollupManagerFactory,
[
trustedAggregator,
- pendingStateTimeout,
- trustedAggregatorTimeout,
admin,
timelockAddressRollupManager,
emergencyCouncilAddress,
- ethers.ZeroAddress, // unused parameter
- ethers.ZeroAddress, // unused parameter
- 0, // unused parameter
- 0, // unused parameter
],
{
- initializer: "initialize",
+ initializer: "initialize(address,address,address,address)",
constructorArgs: [
polygonZkEVMGlobalExitRoot?.target,
polTokenAddress,
@@ -491,9 +484,6 @@ async function main() {
console.log("polTokenAddress:", await polygonRollupManagerContract.pol());
console.log("polygonZkEVMBridgeContract:", await polygonRollupManagerContract.bridgeAddress());
- console.log("pendingStateTimeout:", await polygonRollupManagerContract.pendingStateTimeout());
- console.log("trustedAggregatorTimeout:", await polygonRollupManagerContract.trustedAggregatorTimeout());
-
// Check roles
expect(await polygonRollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelockAddressRollupManager)).to.be.equal(
true
diff --git a/deployment/v2/4_createRollup.ts b/deployment/v2/4_createRollup.ts
index 556dbb329..1d4033d3d 100644
--- a/deployment/v2/4_createRollup.ts
+++ b/deployment/v2/4_createRollup.ts
@@ -7,24 +7,25 @@ import fs = require("fs");
import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../.env")});
import {ethers, upgrades} from "hardhat";
-import {HardhatEthersSigner} from "@nomicfoundation/hardhat-ethers/signers";
-const {create2Deployment} = require("../helpers/deployment-helpers");
const pathGenesis = path.join(__dirname, "./genesis.json");
+const pathGenesisSovereign = path.join(__dirname, "./genesis_sovereign.json");
+import {processorUtils, Constants} from "@0xpolygonhermez/zkevm-commonjs";
const createRollupParameters = require("./create_rollup_parameters.json");
-const genesis = require("./genesis.json");
+let genesis = require(pathGenesis);
const deployOutput = require("./deploy_output.json");
import "../helpers/utils";
+import updateVanillaGenesis from "./utils/updateVanillaGenesis";
const pathOutputJson = path.join(__dirname, "./create_rollup_output.json");
import {
PolygonRollupManager,
- PolygonZkEVMV2,
+ PolygonZkEVMEtrog,
PolygonZkEVMBridgeV2,
- PolygonValidium,
PolygonValidiumEtrog,
+ PolygonPessimisticConsensus,
} from "../../typechain-types";
async function main() {
@@ -64,24 +65,47 @@ async function main() {
adminZkEVM,
forkID,
consensusContract,
+ isVanillaClient,
+ sovereignParams,
} = createRollupParameters;
- const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"];
+ const supportedConsensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonPessimisticConsensus"];
- if (!supportedConensus.includes(consensusContract)) {
- throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`);
+ if (!supportedConsensus.includes(consensusContract)) {
+ throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConsensus}`);
+ }
+
+ // Check consensus compatibility
+ if (isVanillaClient) {
+ if (consensusContract !== "PolygonPessimisticConsensus") {
+ throw new Error(`Vanilla client only supports PolygonPessimisticConsensus`);
+ }
+
+ // Check sovereign params
+ const mandatorySovereignParams = [
+ "bridgeManager",
+ "sovereignWETHAddress",
+ "sovereignWETHAddressIsNotMintable",
+ "globalExitRootUpdater",
+ "globalExitRootRemover",
+ ];
+ for (const parameterName of mandatorySovereignParams) {
+ if (typeof sovereignParams[parameterName] === undefined || sovereignParams[parameterName] === "") {
+ throw new Error(`Missing sovereign parameter: ${parameterName}`);
+ }
+ }
}
const dataAvailabilityProtocol = createRollupParameters.dataAvailabilityProtocol || "PolygonDataCommittee";
- const supporteDataAvailabilityProtocols = ["PolygonDataCommittee"];
+ const supportedDataAvailabilityProtocols = ["PolygonDataCommittee"];
if (
- consensusContract.includes("PolygonValidium") &&
- !supporteDataAvailabilityProtocols.includes(dataAvailabilityProtocol)
+ consensusContract.includes("PolygonValidiumEtrog") &&
+ !supportedDataAvailabilityProtocols.includes(dataAvailabilityProtocol)
) {
throw new Error(
- `Data availability protocol not supported, supported data availability protocols are: ${supporteDataAvailabilityProtocols}`
+ `Data availability protocol not supported, supported data availability protocols are: ${supportedDataAvailabilityProtocols}`
);
}
@@ -133,11 +157,17 @@ async function main() {
}
// Load Rollup manager
- const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
- const rollupManagerContract = PolgonRollupManagerFactory.attach(
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
deployOutput.polygonRollupManagerAddress
) as PolygonRollupManager;
+ // Load global exit root manager
+ const globalExitRootManagerFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer);
+ const globalExitRootManagerContract = globalExitRootManagerFactory.attach(
+ deployOutput.polygonZkEVMGlobalExitRootAddress
+ ) as PolygonRollupManager;
+
const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
if ((await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, deployer.address)) == false) {
throw new Error(
@@ -146,23 +176,28 @@ async function main() {
}
let verifierContract;
+ let verifierName;
if (realVerifier === true) {
- let verifierName;
- if (forkID > 9) {
+ if (consensusContract != "PolygonPessimisticConsensus") {
verifierName = `FflonkVerifier_${forkID}`;
+
+ const VerifierRollup = await ethers.getContractFactory(verifierName, deployer);
+ verifierContract = await VerifierRollup.deploy();
+ await verifierContract.waitForDeployment();
} else {
- verifierName = "FflonkVerifier";
+ verifierName = "SP1VerifierPlonk";
+ const VerifierRollup = await ethers.getContractFactory(verifierName, deployer);
+ verifierContract = await VerifierRollup.deploy();
+ await verifierContract.waitForDeployment();
}
-
- const VerifierRollup = await ethers.getContractFactory(verifierName, deployer);
- verifierContract = await VerifierRollup.deploy();
- await verifierContract.waitForDeployment();
} else {
- const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock", deployer);
+ verifierName = "VerifierRollupHelperMock";
+ const VerifierRollupHelperFactory = await ethers.getContractFactory(verifierName, deployer);
verifierContract = await VerifierRollupHelperFactory.deploy();
await verifierContract.waitForDeployment();
}
console.log("#######################\n");
+ console.log("Verifier name:", verifierName);
console.log("Verifier deployed to:", verifierContract.target);
// Since it's a mock deployment deployer has all the rights
@@ -190,15 +225,29 @@ async function main() {
await PolygonconsensusContract.waitForDeployment();
// Add a new rollup type with timelock
- const rollupCompatibilityID = 0;
+ let rollupVerifierType;
+ let genesisFinal;
+ let programVKey;
+
+ if (consensusContract == "PolygonPessimisticConsensus") {
+ rollupVerifierType = 1;
+ genesisFinal = ethers.ZeroHash;
+ programVKey = createRollupParameters.programVKey || ethers.ZeroHash;
+ } else {
+ rollupVerifierType = 0;
+ genesisFinal = genesis.root;
+ programVKey = ethers.ZeroHash;
+ }
+
await (
await rollupManagerContract.addNewRollupType(
PolygonconsensusContract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
- genesis.root,
- description
+ rollupVerifierType,
+ genesisFinal,
+ description,
+ programVKey
)
).wait();
@@ -208,20 +257,25 @@ async function main() {
let gasTokenAddress, gasTokenNetwork, gasTokenMetadata;
+ // Get bridge instance
+ const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer);
+ const polygonZkEVMBridgeContract = bridgeFactory.attach(
+ deployOutput.polygonZkEVMBridgeAddress
+ ) as PolygonZkEVMBridgeV2;
if (
createRollupParameters.gasTokenAddress &&
- createRollupParameters.gasTokenAddress != "" &&
- createRollupParameters.gasTokenAddress != ethers.ZeroAddress
+ createRollupParameters.gasTokenAddress !== "" &&
+ createRollupParameters.gasTokenAddress !== ethers.ZeroAddress
) {
- // Get bridge instance
- const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer);
- const polygonZkEVMBridgeContract = bridgeFactory.attach(
- deployOutput.polygonZkEVMBridgeAddress
- ) as PolygonZkEVMBridgeV2;
-
// Get token metadata
gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(createRollupParameters.gasTokenAddress);
-
+ outputJson.gasTokenMetadata = gasTokenMetadata;
+ // If gas token metadata includes `0x124e4f545f56414c49445f454e434f44494e47 (NOT_VALID_ENCODING)` means there is no erc20 token deployed at the selected gas token network
+ if (gasTokenMetadata.includes("124e4f545f56414c49445f454e434f44494e47")) {
+ throw new Error(
+ `Invalid gas token address, no ERC20 token deployed at the selected gas token network ${createRollupParameters.gasTokenAddress}`
+ );
+ }
const wrappedData = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(
createRollupParameters.gasTokenAddress
);
@@ -239,10 +293,11 @@ async function main() {
gasTokenNetwork = 0;
gasTokenMetadata = "0x";
}
-
+ outputJson.gasTokenAddress = gasTokenAddress;
+ const nonce = await currentProvider.getTransactionCount(rollupManagerContract.target);
const newZKEVMAddress = ethers.getCreateAddress({
from: rollupManagerContract.target as string,
- nonce: await currentProvider.getTransactionCount(rollupManagerContract.target),
+ nonce: nonce,
});
// Create new rollup
@@ -262,10 +317,10 @@ async function main() {
const rollupID = await rollupManagerContract.chainIDToRollupID(chainID);
console.log("#######################\n");
- console.log("Created new Rollup:", newZKEVMAddress);
+ console.log(`Created new ${consensusContract} Rollup:`, newZKEVMAddress);
- if (consensusContract.includes("PolygonValidium") && dataAvailabilityProtocol === "PolygonDataCommittee") {
- // deploy data commitee
+ if (consensusContract.includes("PolygonValidiumEtrog") && dataAvailabilityProtocol === "PolygonDataCommittee") {
+ // deploy data committee
const PolygonDataCommitteeContract = (await ethers.getContractFactory("PolygonDataCommittee", deployer)) as any;
let polygonDataCommittee;
@@ -287,7 +342,7 @@ async function main() {
await polygonDataCommittee?.waitForDeployment();
// Load data commitee
- const PolygonValidiumContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonValidium;
+ const PolygonValidiumContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonValidiumEtrog;
// add data commitee to the consensus contract
if ((await PolygonValidiumContract.admin()) == deployer.address) {
await (
@@ -320,27 +375,120 @@ async function main() {
}
}
- // Add the first batch of the created rollup
- const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMV2;
- const batchData = {
- transactions: await newZKEVMContract.generateInitializeTransaction(
- rollupID,
+ let batchData = "";
+ /**
+ If the system is running a "vanilla client" (i.e., a basic, unmodified Ethereum client or rollup setup), the genesis block should include the deployment of the sovereign contracts, and these contracts should already be initialized with their required initial state and configurations. This means that the genesis block will contain the initial state for these contracts, allowing the system to start running without needing any additional initialization steps. However, for other rollups, additional configuration is needed. In this case, instead of having everything pre-initialized in the genesis block, we must inject an "initialization batch" into the genesis file. This batch will contain specific instructions for initializing the contracts at the time of rollup deployment. The injected initialization batch allows the system to be configured dynamically during deployment.
+ */
+ if (isVanillaClient) {
+ const initializeParams = {
+ rollupID: rollupID,
gasTokenAddress,
gasTokenNetwork,
- gasTokenMetadata as any
- ),
- globalExitRoot: globalExitRoot,
- timestamp: timestampReceipt,
- sequencer: trustedSequencer,
- };
+ polygonRollupManager: ethers.ZeroAddress,
+ gasTokenMetadata,
+ bridgeManager: sovereignParams.bridgeManager,
+ sovereignWETHAddress: sovereignParams.sovereignWETHAddress,
+ sovereignWETHAddressIsNotMintable: sovereignParams.sovereignWETHAddressIsNotMintable,
+ globalExitRootUpdater: sovereignParams.globalExitRootUpdater,
+ globalExitRootRemover: sovereignParams.globalExitRootRemover,
+ };
+ genesis = await updateVanillaGenesis(genesis, chainID, initializeParams);
+ // Add weth address to deployment output if gas token address is provided and sovereignWETHAddress is not provided
+ if (
+ gasTokenAddress !== ethers.ZeroAddress &&
+ ethers.isAddress(gasTokenAddress) &&
+ (sovereignParams.sovereignWETHAddress === ethers.ZeroAddress ||
+ !ethers.isAddress(sovereignParams.sovereignWETHAddress))
+ ) {
+ const wethObject = genesis.genesis.find(function (obj) {
+ return obj.contractName == "WETH";
+ });
+ outputJson.WETHAddress = wethObject.address;
+ }
+ } else {
+ if (consensusContract === "PolygonPessimisticConsensus") {
+ // Add the first batch of the created rollup
+ const newZKEVMContract = (await PolygonconsensusFactory.attach(
+ newZKEVMAddress
+ )) as PolygonPessimisticConsensus;
+
+ // Get last GER
+ const lastGER = await globalExitRootManagerContract.getLastGlobalExitRoot();
+
+ const dataInjectedTx = await polygonZkEVMBridgeContract.interface.encodeFunctionData("initialize", [
+ rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ Constants.ADDRESS_GLOBAL_EXIT_ROOT_MANAGER_L2, // Global exit root address on L2
+ ethers.ZeroAddress, // Rollup manager on L2 does not exist
+ gasTokenMetadata as any,
+ ]);
+
+ // check maximum length is 65535
+ if ((dataInjectedTx.length - 2) / 2 > 0xffff) {
+ // throw error
+ throw new Error(`HugeTokenMetadataNotSupported`);
+ }
+ const injectedTx = {
+ type: 0, // force ethers to parse it as a legacy transaction
+ chainId: 0, // force ethers to parse it as a pre-EIP155 transaction
+ to: await newZKEVMContract.bridgeAddress(),
+ value: 0,
+ gasPrice: 0,
+ gasLimit: 30000000,
+ nonce: 0,
+ data: dataInjectedTx,
+ signature: {
+ v: "0x1b",
+ r: "0x00000000000000000000000000000000000000000000000000000005ca1ab1e0",
+ s: "0x000000000000000000000000000000000000000000000000000000005ca1ab1e",
+ },
+ };
+
+ // serialize transactions
+ const txObject = ethers.Transaction.from(injectedTx);
+
+ const customData = processorUtils.rawTxToCustomRawTx(txObject.serialized);
+ batchData = {
+ batchL2Data: customData,
+ globalExitRoot: lastGER,
+ timestamp: blockDeploymentRollup.timestamp,
+ sequencer: trustedSequencer,
+ l1BlockNumber: blockDeploymentRollup.number,
+ l1BlockHash: blockDeploymentRollup.hash,
+ l1ParentHash: blockDeploymentRollup.parentHash,
+ };
+ } else {
+ // Add the first batch of the created rollup
+ const newZKEVMContract = (await PolygonconsensusFactory.attach(newZKEVMAddress)) as PolygonZkEVMEtrog;
+ batchData = {
+ batchL2Data: await newZKEVMContract.generateInitializeTransaction(
+ rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ gasTokenMetadata as any
+ ),
+ globalExitRoot: globalExitRoot,
+ timestamp: timestampReceipt,
+ sequencer: trustedSequencer,
+ };
+ }
+ }
outputJson.firstBatchData = batchData;
outputJson.genesis = genesis.root;
outputJson.createRollupBlockNumber = blockDeploymentRollup.number;
outputJson.rollupAddress = newZKEVMAddress;
outputJson.verifierAddress = verifierContract.target;
outputJson.consensusContract = consensusContract;
+ outputJson.consensusContractAddress = PolygonconsensusContract.target;
+ outputJson.rollupTypeId = newRollupTypeID;
+ outputJson.programVKey = programVKey;
+ // Rewrite updated genesis in case of vanilla client
+ if (isVanillaClient) {
+ fs.writeFileSync(pathGenesisSovereign, JSON.stringify(genesis, null, 1));
+ }
fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1));
}
diff --git a/deployment/v2/README.md b/deployment/v2/README.md
index 3e4e37a62..93715907b 100644
--- a/deployment/v2/README.md
+++ b/deployment/v2/README.md
@@ -20,12 +20,12 @@ cd deployment
cp deploy_parameters.json.example deploy_parameters.json
```
-Fill created `deploy_parameters.json` with appropiate parameters.
+Fill created `deploy_parameters.json` with appropriate parameters.
See below for more information about the `deploy_parameters.json`
The first step is deploying and verifying the `PolygonZkEVMDeployer`, this will be the factory for deterministic contracts, the address of the contracts will depend on the `salt` and the `initialZkEVMDeployerOwner`
-This contrat is deployed using a keyless deployment, therefore the gasPrice is hardcoded.
+This contract is deployed using a keyless deployment, therefore the gasPrice is hardcoded.
The value is on `100 gweis`, if it's necessary to update it go to `helpers/deployment-helpers.js` and update the `gasPriceKeylessDeployment` constant.
Note that this operation will change all the deterministic address deployed.
@@ -38,7 +38,7 @@ To deploy on testnet is necessary a token MATIC contract, therefore, there's ano
To deploy on testnet use:`deploy:testnet:ZkEVM:${network}`
-In other cases use fullfill `maticTokenAddress` in the `deploy_parameters.json` and run `deploy:ZkEVM:${network}`
+In other cases use fulfill `maticTokenAddress` in the `deploy_parameters.json` and run `deploy:ZkEVM:${network}`
```
npm run deploy:testnet:ZkEVM:goerli
@@ -51,12 +51,12 @@ To verify contracts use `npm run verify:ZkEVM:${network}`
npm run verify:ZkEVM:goerli
```
-A new folder will be created witth the following name `deployments/${network}_$(date +%s)` with all the output information and the OZ proxy information.
+A new folder will be created with the following name `deployments/${network}_$(date +%s)` with all the output information and the OZ proxy information.
## deploy-parameters.json
- `test`: bool, Indicate if it's a test deployment, which will fund the deployer address with pre minted ether and will give more powers to the deployer address to make easier the flow.
-- `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradability process via timelock
+- `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradeability process via timelock
- `minDelayTimelock`: number, Minimum timelock delay,
- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge
- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer`
@@ -64,9 +64,9 @@ A new folder will be created witth the following name `deployments/${network}_$(
- `trustedAggregator`: address, Trusted aggregator address
- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it
- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated by everyone
-- `emergencyCouncilAddress`:address, Emergency council addres
-- `polTokenAddress`: address, Matic token address, only if deploy on testnet can be left blank and will fullfilled by the scripts.
-- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fullfilled automatically with the `deploy:deployer:ZkEVM:goerli` script.
+- `emergencyCouncilAddress`: address, Emergency council address
+- `polTokenAddress`: address, POL token address, only if deploy on testnet can be left blank and will fulfilled by the scripts.
+- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fulfilled automatically with the `deploy:deployer:ZkEVM:goerli` script.
## create_rollup_parameters.json
@@ -74,7 +74,7 @@ A new folder will be created witth the following name `deployments/${network}_$(
- `trustedSequencerURL`: string, trustedSequencer URL
- `networkName`: string, networkName
- `description`: string, Description of the new rollup type
-- `trustedSequencer`: address, trusted sequencer addresss
+- `trustedSequencer`: address, trusted sequencer address
- `chainID`: uint64, chainID of the new rollup
- `adminZkEVM`: address, Admin address, can adjust Rollup parameters
- `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version
@@ -84,13 +84,13 @@ A new folder will be created witth the following name `deployments/${network}_$(
### Optional Parameters on both parameters
- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist
-- `maxFeePerGas`: string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it
-- `maxPriorityFeePerGas`: string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it
+- `maxFeePerGas`: string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it
+- `maxPriorityFeePerGas`: string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it
- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect
-- `dataAvailabilityProtocol`: string, Data availability protocol, only mandatory/used when consensus contract is a Validiums, currently the only supported value is: `PolygonDataCommittee`
+- `dataAvailabilityProtocol`: string, Data availability protocol, only mandatory/used when consensus contract is a Validium, currently the only supported value is: `PolygonDataCommittee`
## Notes
- Since there are deterministic address you cannot deploy twice on the same network using the same `salt` and `initialZkEVMDeployerOwner`. Changing one of them is enough to make a new deployment.
-- It's mandatory to delete the `.openzeppelin` upgradebility information in order to make a new deployment
-- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` aswell.
+- It's mandatory to delete the `.openzeppelin` upgradeability information in order to make a new deployment
+- `genesis.json` has been generated using the tool: `1_createGenesis`, this script depends on the `deploy_parameters` as well.
diff --git a/deployment/v2/create_rollup_parameters.json.example b/deployment/v2/create_rollup_parameters.json.example
index 1693f4f87..034cf1b35 100644
--- a/deployment/v2/create_rollup_parameters.json.example
+++ b/deployment/v2/create_rollup_parameters.json.example
@@ -6,11 +6,20 @@
"trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D",
"chainID": 1001,
"adminZkEVM":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D",
- "forkID": 11,
+ "forkID": 12,
"consensusContract": "PolygonZkEVMEtrog",
+ "programVKey": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasTokenAddress":"",
"deployerPvtKey": "",
"maxFeePerGas":"",
"maxPriorityFeePerGas":"",
- "multiplierGas": ""
+ "multiplierGas": "",
+ "isVanillaClient": false,
+ "sovereignParams": {
+ "bridgeManager": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "sovereignWETHAddress": "0x0000000000000000000000000000000000000000",
+ "sovereignWETHAddressIsNotMintable": false,
+ "globalExitRootUpdater": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "globalExitRootRemover": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
+ }
}
diff --git a/deployment/v2/utils/deployment-utils.ts b/deployment/v2/utils/deployment-utils.ts
new file mode 100644
index 000000000..30bc04ce2
--- /dev/null
+++ b/deployment/v2/utils/deployment-utils.ts
@@ -0,0 +1,12 @@
+const padTo32Bytes = (value) => {
+ const hexValue = value.startsWith("0x") ? value.slice(2) : value; // Remove '0x'
+ return "0x" + hexValue.padStart(64, "0"); // Pad to 64 hex digits
+};
+const padTo20Bytes = (value) => {
+ const hexValue = value.startsWith("0x") ? value.slice(2) : value; // Remove '0x'
+ return "0x" + hexValue.padStart(40, "0"); // Pad to 40 hex digits
+};
+export {
+ padTo32Bytes,
+ padTo20Bytes
+}
\ No newline at end of file
diff --git a/deployment/v2/utils/updateVanillaGenesis.ts b/deployment/v2/utils/updateVanillaGenesis.ts
new file mode 100644
index 000000000..46eb0b1c0
--- /dev/null
+++ b/deployment/v2/utils/updateVanillaGenesis.ts
@@ -0,0 +1,399 @@
+import {expect} from "chai";
+import {ethers} from "hardhat";
+
+import {MemDB, ZkEVMDB, getPoseidon, smtUtils, processorUtils} from "@0xpolygonhermez/zkevm-commonjs";
+const {getContractAddress} = require("@ethersproject/address");
+
+import {padTo32Bytes, padTo20Bytes} from "./deployment-utils";
+
+// constants
+// Those contracts names came from the genesis creation:
+// - https://github.com/0xPolygonHermez/zkevm-contracts/blob/main/deployment/v2/1_createGenesis.ts#L294
+// - https://github.com/0xPolygonHermez/zkevm-contracts/blob/main/deployment/v2/1_createGenesis.ts#L328
+// Genesis files have been created previously and so they have old naming, as it shown in the links above
+// Those genesis are already imported on different tooling and added as a metedata on-chain. Therefore, this util aims
+// to support them too
+const bridgeContractName = "BridgeL2SovereignChain";
+const supportedGERManagers = ["PolygonZkEVMGlobalExitRootL2 implementation"];
+const supportedBridgeContracts = ['PolygonZkEVMBridge implementation', 'PolygonZkEVMBridgeV2 implementation'];
+const supportedBridgeContractsProxy = ['PolygonZkEVMBridgeV2 proxy', 'PolygonZkEVMBridge proxy'];
+
+async function updateVanillaGenesis(genesis, chainID, initializeParams) {
+ // Load genesis on a zkEVMDB
+ const poseidon = await getPoseidon();
+ const {F} = poseidon;
+ const db = new MemDB(F);
+ const genesisRoot = [F.zero, F.zero, F.zero, F.zero];
+ const accHashInput = [F.zero, F.zero, F.zero, F.zero];
+ const zkEVMDB = await ZkEVMDB.newZkEVM(
+ db,
+ poseidon,
+ genesisRoot,
+ accHashInput,
+ genesis.genesis,
+ null,
+ null,
+ chainID
+ );
+ const batch = await zkEVMDB.buildBatch(
+ 1000, //limitTimestamp
+ ethers.ZeroAddress, //trustedSequencer
+ smtUtils.stringToH4(ethers.ZeroHash) // l1InfoRoot
+ );
+ // Add changeL2Block tx
+ const txChangeL2Block = {
+ type: 11,
+ deltaTimestamp: 3,
+ l1Info: {
+ globalExitRoot: ethers.ZeroAddress, // Can be any value
+ blockHash: "0x24a5871d68723340d9eadc674aa8ad75f3e33b61d5a9db7db92af856a19270bb", // Can be any value
+ timestamp: "42",
+ },
+ indexL1InfoTree: 0,
+ };
+ const rawChangeL2BlockTx = processorUtils.serializeChangeL2Block(txChangeL2Block);
+ batch.addRawTx(`0x${rawChangeL2BlockTx}`);
+
+ // Create deploy bridge transaction
+ const sovereignBridgeFactory = await ethers.getContractFactory("BridgeL2SovereignChain");
+ // Get deploy transaction for bridge
+ const deployBridgeData = await sovereignBridgeFactory.getDeployTransaction();
+ const injectedTx = {
+ type: 0, // force ethers to parse it as a legacy transaction
+ chainId: 0, // force ethers to parse it as a pre-EIP155 transaction
+ to: null,
+ value: 0,
+ gasPrice: 0,
+ gasLimit: 30000000,
+ nonce: 0,
+ data: deployBridgeData.data,
+ signature: {
+ v: "0x1b",
+ r: "0x00000000000000000000000000000000000000000000000000000005ca1ab1e0",
+ s: "0x000000000000000000000000000000000000000000000000000000005ca1ab1e",
+ },
+ };
+ let txObject = ethers.Transaction.from(injectedTx);
+ const txDeployBridge = processorUtils.rawTxToCustomRawTx(txObject.serialized);
+ // Check ecrecover
+ expect(txObject.from).to.equal(ethers.recoverAddress(txObject.unsignedHash, txObject.signature as any));
+ batch.addRawTx(txDeployBridge);
+ const sovereignBridgeAddress = getContractAddress({from: txObject.from, nonce: injectedTx.nonce});
+
+ // Create deploy GER transaction
+ const gerContractName = "GlobalExitRootManagerL2SovereignChain";
+ const gerFactory = await ethers.getContractFactory(gerContractName);
+ const oldBridge = genesis.genesis.find(function (obj) {
+ return supportedBridgeContracts.includes(obj.contractName);
+ });
+ // Get bridge proxy address
+ const bridgeProxy = genesis.genesis.find(function (obj) {
+ return supportedBridgeContractsProxy.includes(obj.contractName);
+ });
+ const deployGERData = await gerFactory.getDeployTransaction(bridgeProxy.address);
+ injectedTx.data = deployGERData.data;
+ txObject = ethers.Transaction.from(injectedTx);
+ const txDeployGER = processorUtils.rawTxToCustomRawTx(txObject.serialized);
+ // Check ecrecover
+ expect(txObject.from).to.equal(ethers.recoverAddress(txObject.unsignedHash, txObject.signature as any));
+ batch.addRawTx(txDeployGER);
+ const GERAddress = getContractAddress({from: txObject.from, nonce: injectedTx.nonce});
+
+ await batch.executeTxs();
+ await zkEVMDB.consolidate(batch);
+
+ // replace old bridge and ger manager by sovereign contracts bytecode
+ oldBridge.contractName = bridgeContractName + " implementation";
+ oldBridge.bytecode = `0x${await zkEVMDB.getBytecode(sovereignBridgeAddress)}`;
+
+ const oldGer = genesis.genesis.find(function (obj) {
+ return supportedGERManagers.includes(obj.contractName);
+ });
+ oldGer.contractName = gerContractName + " implementation";
+ oldGer.bytecode = `0x${await zkEVMDB.getBytecode(GERAddress)}`;
+
+ // Setup a second zkEVM to initialize both contracts
+ const zkEVMDB2 = await ZkEVMDB.newZkEVM(
+ new MemDB(F),
+ poseidon,
+ genesisRoot,
+ accHashInput,
+ genesis.genesis,
+ null,
+ null,
+ chainID
+ );
+ const batch2 = await zkEVMDB2.buildBatch(
+ 1000, //limitTimestamp
+ ethers.ZeroAddress, //trustedSequencer
+ smtUtils.stringToH4(ethers.ZeroHash) // l1InfoRoot
+ );
+ // Add changeL2Block tx
+ batch2.addRawTx(`0x${rawChangeL2BlockTx}`);
+ const gerProxy = genesis.genesis.find(function (obj) {
+ return obj.contractName == "PolygonZkEVMGlobalExitRootL2 proxy";
+ });
+ // Initialize bridge
+ const {
+ rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ polygonRollupManager,
+ gasTokenMetadata,
+ bridgeManager,
+ sovereignWETHAddress,
+ sovereignWETHAddressIsNotMintable,
+ globalExitRootUpdater,
+ globalExitRootRemover,
+ } = initializeParams;
+ const initializeData = sovereignBridgeFactory.interface.encodeFunctionData(
+ "initialize(uint32,address,uint32,address,address,bytes,address,address,bool)",
+ [
+ rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ gerProxy.address, // Global exit root manager address from base genesis
+ polygonRollupManager,
+ gasTokenMetadata,
+ bridgeManager,
+ sovereignWETHAddress,
+ sovereignWETHAddressIsNotMintable,
+ ]
+ );
+ injectedTx.to = bridgeProxy.address;
+ injectedTx.data = initializeData;
+ txObject = ethers.Transaction.from(injectedTx);
+ const txInitializeBridge = processorUtils.rawTxToCustomRawTx(txObject.serialized);
+ // Check ecrecover
+ expect(txObject.from).to.equal(ethers.recoverAddress(txObject.unsignedHash, txObject.signature as any));
+ batch2.addRawTx(txInitializeBridge);
+
+ // Initialize GER Manager
+ const initializeGERData = gerFactory.interface.encodeFunctionData("initialize", [
+ globalExitRootUpdater,
+ globalExitRootRemover,
+ ]);
+ // Update injectedTx to initialize GER
+ injectedTx.to = gerProxy.address;
+ injectedTx.data = initializeGERData;
+
+ const txObject2 = ethers.Transaction.from(injectedTx);
+ const txInitializeGER = processorUtils.rawTxToCustomRawTx(txObject2.serialized);
+ // Check ecrecover
+ expect(txObject.from).to.equal(ethers.recoverAddress(txObject.unsignedHash, txObject.signature as any));
+ batch2.addRawTx(txInitializeGER);
+
+ // Execute batch
+ await batch2.executeTxs();
+ await zkEVMDB2.consolidate(batch2);
+
+ // Update bridgeProxy storage and nonce
+ bridgeProxy.contractName = bridgeContractName + " proxy";
+ bridgeProxy.storage = await zkEVMDB2.dumpStorage(bridgeProxy.address);
+ // Update nonce, in case weth is deployed at initialize, it is increased
+ const bridgeProxyState = await zkEVMDB2.getCurrentAccountState(bridgeProxy.address)
+ bridgeProxy.nonce = String(Number(bridgeProxyState.nonce));
+ // If bridge initialized with a zero sovereign weth address and a non zero gas token, we should add created erc20 weth contract to the genesis
+ let wethAddress;
+ if (
+ gasTokenAddress !== ethers.ZeroAddress &&
+ ethers.isAddress(gasTokenAddress) &&
+ (sovereignWETHAddress === ethers.ZeroAddress || !ethers.isAddress(sovereignWETHAddress))
+ ) {
+ wethAddress = padTo20Bytes(
+ bridgeProxy.storage["0x000000000000000000000000000000000000000000000000000000000000006f"]
+ );
+ const wethGenesis = {
+ contractName: "WETH",
+ balance: "0",
+ nonce: "1",
+ address: wethAddress,
+ bytecode: `0x${await zkEVMDB2.getBytecode(wethAddress)}`,
+ };
+ const wethStorage = await zkEVMDB2.dumpStorage(wethAddress);
+ wethGenesis.storage = Object.entries(wethStorage).reduce((acc, [key, value]) => {
+ acc[key] = padTo32Bytes(value);
+ return acc;
+ }, {});
+ genesis.genesis.push(wethGenesis);
+ }
+
+ // Pad storage values with zeros
+ bridgeProxy.storage = Object.entries(bridgeProxy.storage).reduce((acc, [key, value]) => {
+ acc[key] = padTo32Bytes(value);
+ return acc;
+ }, {});
+
+ // CHECK BRIDGE PROXY STORAGE
+ // Storage value pointing bridge implementation
+ expect(bridgeProxy.storage["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]).to.include(
+ oldBridge.address.toLowerCase().slice(2)
+ );
+
+ // Storage value of proxyAdmin
+ const proxyAdminObject = genesis.genesis.find(function (obj) {
+ return obj.contractName == "ProxyAdmin";
+ });
+ expect(bridgeProxy.storage["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]).to.include(
+ proxyAdminObject.address.toLowerCase().slice(2)
+ );
+
+ // Storage value of bridge manager
+ expect(bridgeProxy.storage["0x00000000000000000000000000000000000000000000000000000000000000a3"]).to.include(
+ bridgeManager.toLowerCase().slice(2)
+ );
+
+ // Storage value for the _initialized uint8 variable of Initializable.sol contract, incremented each time the contract is successfully initialized. It also stores the _initializing param set to true when an initialization function is being executed, and it reverts to false once the initialization completed.
+ expect(bridgeProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000000"]).to.equal(
+ "0x0000000000000000000000000000000000000000000000000000000000000001"
+ );
+
+ // Storage value for the _status variable of ReentrancyGuardUpgradeable contract. Tracks the current "status" of the contract to enforce the non-reentrant behavior. Default value is 1 (_NOT_ENTERED)
+ expect(bridgeProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000001"]).to.equal(
+ "0x0000000000000000000000000000000000000000000000000000000000000001"
+ );
+
+ // Storage value for global exit root manager (proxy) address
+ expect(bridgeProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000068"]).to.include(
+ gerProxy.address.toLowerCase().slice(2)
+ );
+
+ // Storage value for rollup/network id
+ // RollupID value is stored at position 68 with globalExitRootManager address. Slice from byte 2 to 2-8 to get the rollupID
+ expect(
+ bridgeProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000068"].slice(
+ 2 + 54,
+ 2 + 54 + 8
+ )
+ ).to.include(rollupID.toString(16));
+
+ // Storage value for gas token address
+ if (gasTokenAddress !== ethers.ZeroAddress && ethers.isAddress(gasTokenAddress)) {
+ expect(
+ ethers.toBigInt(bridgeProxy.storage["0x000000000000000000000000000000000000000000000000000000000000006d"])
+ ).to.equal(
+ ethers.toBigInt(`${ethers.toBeHex(gasTokenNetwork)}${gasTokenAddress.replace(/^0x/, "")}`.toLowerCase())
+ );
+ if (ethers.isAddress(sovereignWETHAddress) && sovereignWETHAddress !== ethers.ZeroAddress) {
+ // Storage value for sovereignWETH address (ony if network with native gas token) and sovereignWethAddress is set
+ expect(
+ bridgeProxy.storage["0x000000000000000000000000000000000000000000000000000000000000006f"]
+ ).to.include(sovereignWETHAddress.toLowerCase().slice(2));
+
+ // Storage address for sovereignWETHAddressIsNotMintable mapping
+ // To get the key we encode the key of the mapping with the position in the mapping
+ if (sovereignWETHAddressIsNotMintable) {
+ const mappingSlot = 162; // Slot of the mapping in the bridge contract
+ const key = ethers.keccak256(
+ ethers.AbiCoder.defaultAbiCoder().encode(
+ ["address", "uint256"],
+ [sovereignWETHAddress, mappingSlot]
+ )
+ );
+ expect(bridgeProxy.storage[key]).to.equal(
+ "0x0000000000000000000000000000000000000000000000000000000000000001"
+ );
+ }
+ } else {
+ // Storage value for WETH address (ony if network with native gas token), deployed at bridge initialization
+ expect(
+ bridgeProxy.storage["0x000000000000000000000000000000000000000000000000000000000000006f"]
+ ).to.include(wethAddress.toLowerCase().slice(2));
+
+ // CHECK WETH STORAGE
+ const wethOject = genesis.genesis.find(function (obj) {
+ return obj.contractName == "WETH";
+ });
+
+ // Storage for erc20 name 'Wrapped Ether'
+ expect(wethOject.storage["0x0000000000000000000000000000000000000000000000000000000000000003"]).to.equal(
+ "0x577261707065642045746865720000000000000000000000000000000000001a"
+ );
+
+ // Storage for erc20 code 'WETH'
+ expect(wethOject.storage["0x0000000000000000000000000000000000000000000000000000000000000004"]).to.equal(
+ "0x5745544800000000000000000000000000000000000000000000000000000008"
+ );
+ }
+
+ // Storage values for gasTokenMetadata, its a bytes variable
+ let offset = 2 + 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142a"]).to.include(
+ gasTokenMetadata.slice(2, offset)
+ );
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142b"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ offset += 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142c"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ offset += 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142d"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ offset += 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142e"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ offset += 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db7142f"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ offset += 64;
+ expect(bridgeProxy.storage["0x9930d9ff0dee0ef5ca2f7710ea66b8f84dd0f5f5351ecffe72b952cd9db71430"]).to.include(
+ gasTokenMetadata.slice(offset, offset + 64)
+ );
+ }
+
+ // Check bridge proxy Address is included in ger bytecode
+ expect(oldGer.bytecode).to.include(bridgeProxy.address.toLowerCase().slice(2));
+
+ // Update bridgeProxy storage
+ gerProxy.contractName = gerContractName + " proxy";
+ gerProxy.storage = await zkEVMDB2.dumpStorage(gerProxy.address);
+ gerProxy.storage = Object.entries(gerProxy.storage).reduce((acc, [key, value]) => {
+ acc[key] = padTo32Bytes(value);
+ return acc;
+ }, {});
+
+ // CHECK GER PROXY STORAGE
+ // Storage value of proxy implementation
+ expect(gerProxy.storage["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]).to.include(
+ oldGer.address.toLowerCase().slice(2)
+ );
+
+ // Storage value of proxyAdmin
+ expect(gerProxy.storage["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]).to.include(
+ proxyAdminObject.address.toLowerCase().slice(2)
+ );
+
+ // Storage value of global exit root updater
+ expect(gerProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000034"]).to.include(
+ globalExitRootUpdater.toLowerCase().slice(2)
+ );
+ if (ethers.isAddress(globalExitRootRemover) && globalExitRootRemover !== ethers.ZeroAddress) {
+ // Storage value of global exit root updater
+ expect(gerProxy.storage["0x0000000000000000000000000000000000000000000000000000000000000035"]).to.include(
+ globalExitRootRemover.toLowerCase().slice(2)
+ );
+ }
+
+ // Create a new zkEVM to generate a genesis an empty system address storage
+ const zkEVMDB3 = await ZkEVMDB.newZkEVM(
+ new MemDB(F),
+ poseidon,
+ genesisRoot,
+ accHashInput,
+ genesis.genesis,
+ null,
+ null,
+ chainID
+ );
+ // update genesis root
+ genesis.root = smtUtils.h4toString(zkEVMDB3.getCurrentStateRoot());
+
+ return genesis;
+}
+
+export default updateVanillaGenesis;
diff --git a/docker/README.md b/docker/README.md
index af92beb28..65fdfc2eb 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -13,10 +13,57 @@ You can change the deployment `mnemonic` creating a `.env` file in the project r
- docker
- docker-compose
-## Build dockers
+## Config files
-In project root execute:
+- Complete config `/docker/scripts/v2/create_rollup_parameters_docker.json`
+
+## deploy_parameters.json
+
+- `test`: Flag to point if is a testing environment, in such case, an account with balance will be created at the rollup and no timelock addresses will be used
+- `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradeability process via timelock
+- `minDelayTimelock`: number, Minimum timelock delay,
+- `salt`: bytes32, Salt used in `PolygonZkEVMDeployer` to deploy deterministic contracts, such as the PolygonZkEVMBridge
+- `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer`
+- `admin`: address, Admin address, can adjust RollupManager parameters or stop the emergency state
+- `trustedAggregator`: address, Trusted aggregator address
+- `trustedAggregatorTimeout`: uint64, If a sequence is not verified in this timeout everyone can verify it
+- `pendingStateTimeout`: uint64, Once a pending state exceeds this timeout it can be consolidated by everyone
+- `emergencyCouncilAddress`: address, Emergency council address
+- `polTokenAddress`: address, POL token address, only if deploy on testnet can be left blank and will fulfilled by the scripts.
+- `zkEVMDeployerAddress`: address, Address of the `PolygonZkEVMDeployer`. Can be left blank, will be fulfilled automatically with the `deploy:deployer:ZkEVM:goerli` script
+- `deployerPvtKey`: string, pvtKey of the deployer, overrides the address in `MNEMONIC` of `.env` if exist
+- `maxFeePerGas`: string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it
+- `maxPriorityFeePerGas`: string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it
+- `multiplierGas`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect
+
+## create_rollup_parameters.json
+- `realVerifier`: bool, Indicates whether deploy a real verifier or not for the new created
+- `trustedSequencerURL`: string, trustedSequencer URL
+- `networkName`: string, networkName
+- `description`: string, Description of the new rollup type
+- `trustedSequencer`: address, trusted sequencer address
+- `chainID`: uint64, chainID of the new rollup
+- `adminZkEVM`: address, Admin address, can adjust Rollup parameters
+- `forkID`: uint64, Fork ID of the new rollup, indicates the prover (zkROM/executor) version
+- `consensusContract`: select between consensus contract. Supported: `["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonPessimisticConsensus"]`. This is the name of the consensus of the rollupType of the rollup to be created
+- `gasTokenAddress`: Address of the native gas token of the rollup, zero if ether
+- `deployerPvtKey`: Not mandatory, used to deploy from specific wallet
+- `maxFeePerGas(optional)`: string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it
+- `maxPriorityFeePerGas(optional)`: string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it
+- `multiplierGas(optional)`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect
+- `programVKey`: program key for pessimistic consensus
+- `isVanillaClient`: Flag for vanilla/sovereign clients handling
+- `sovereignParams`: Only mandatory if isVanillaClient = true
+ - `bridgeManager`: bridge manager address
+ - `sovereignWETHAddress`: sovereign WETH address
+ - `sovereignWETHAddressIsNotMintable`: Flag to indicate if the wrapped ETH is not mintable
+ - `globalExitRootUpdater`: Address of globalExitRootUpdater for sovereign chains
+ - `globalExitRootRemover`: Address of globalExitRootRemover for sovereign chains
+
+## Run script
+
+In project root execute:
```
npm i
npm run docker:contracts
@@ -24,5 +71,8 @@ npm run docker:contracts
A new docker `geth-zkevm-contracts:latest` will be created
This docker will contain a geth node with the deployed contracts
-The deployment output can be found in: `docker/deploymentOutput/deploy_output.json`
+The deployment output can be found in:
+- `docker/deploymentOutput/create_rollup_output.json`
+- `docker/deploymentOutput/deploy_output.json`
+- `docker/deploymentOutput/genesis.json`
To run the docker you can use: `docker run -p 8545:8545 geth-zkevm-contracts:latest`
diff --git a/docker/docker-tests.test.ts b/docker/docker-tests.test.ts
new file mode 100644
index 000000000..17c201c3f
--- /dev/null
+++ b/docker/docker-tests.test.ts
@@ -0,0 +1,78 @@
+import {expect} from "chai";
+import {ethers} from "hardhat";
+import fs from "fs";
+import path from "path";
+const deployOutput = JSON.parse(fs.readFileSync(path.join(__dirname, "./deploymentOutput/deploy_output.json"), "utf8"));
+const {polygonRollupManagerAddress, polygonZkEVMBridgeAddress, polygonZkEVMGlobalExitRootAddress, polTokenAddress} =
+ deployOutput;
+const createRollupOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/create_rollup_output.json"), "utf8")
+);
+const {rollupAddress} = createRollupOutput;
+import {
+ PolygonRollupManager,
+ PolygonZkEVMGlobalExitRootV2,
+ PolygonZkEVMBridgeV2,
+ PolygonZkEVMEtrog,
+} from "../typechain-types";
+
+describe("Docker build tests Contract", () => {
+ it("should check PolygonZkEVMEtrog", async () => {
+ const PolygonZkEVMEtrogFactory = await ethers.getContractFactory("PolygonZkEVMEtrog");
+ const PolygonZkEVMEtrogContract = PolygonZkEVMEtrogFactory.attach(rollupAddress) as PolygonZkEVMEtrog;
+ expect(PolygonZkEVMEtrogContract.target).to.equal(rollupAddress);
+ expect(await PolygonZkEVMEtrogContract.globalExitRootManager()).to.equal(polygonZkEVMGlobalExitRootAddress);
+ expect(await PolygonZkEVMEtrogContract.pol()).to.equal(polTokenAddress);
+ expect(await PolygonZkEVMEtrogContract.bridgeAddress()).to.equal(polygonZkEVMBridgeAddress);
+ expect(await PolygonZkEVMEtrogContract.rollupManager()).to.equal(polygonRollupManagerAddress);
+ const admin = await PolygonZkEVMEtrogContract.admin();
+ // If admin is not zero address, means the contract is already initialized
+ expect(admin).to.not.equal(ethers.ZeroAddress);
+ });
+
+ it("should check RollupManager", async () => {
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
+ polygonRollupManagerAddress
+ ) as PolygonRollupManager;
+ expect(rollupManagerContract.target).to.equal(polygonRollupManagerAddress);
+ expect(await rollupManagerContract.bridgeAddress()).to.equal(polygonZkEVMBridgeAddress);
+ expect(await rollupManagerContract.globalExitRootManager()).to.equal(polygonZkEVMGlobalExitRootAddress);
+ expect(await rollupManagerContract.pol()).to.equal(polTokenAddress);
+ });
+
+ it("should check GlobalExitRootV2", async () => {
+ const PolygonZkEVMGlobalExitRootV2Factory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
+ const PolygonZkEVMGlobalExitRootV2Contract = PolygonZkEVMGlobalExitRootV2Factory.attach(
+ polygonZkEVMGlobalExitRootAddress
+ ) as PolygonZkEVMGlobalExitRootV2;
+ expect(PolygonZkEVMGlobalExitRootV2Contract.target).to.equal(polygonZkEVMGlobalExitRootAddress);
+ expect(await PolygonZkEVMGlobalExitRootV2Contract.bridgeAddress()).to.equal(polygonZkEVMBridgeAddress);
+ expect(await PolygonZkEVMGlobalExitRootV2Contract.rollupManager()).to.equal(polygonRollupManagerAddress);
+ // Check already initialized
+ await expect(
+ PolygonZkEVMGlobalExitRootV2Contract.initialize()
+ ).to.be.revertedWith("Initializable: contract is already initialized");
+ });
+
+ it("should check PolygonZkEVMBridgeV2", async () => {
+ const PolygonZkEVMBridgeV2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2");
+ const PolygonZkEVMBridgeV2Contract = PolygonZkEVMBridgeV2Factory.attach(
+ polygonZkEVMBridgeAddress
+ ) as PolygonZkEVMBridgeV2;
+ expect(PolygonZkEVMBridgeV2Contract.target).to.equal(polygonZkEVMBridgeAddress);
+ expect(await PolygonZkEVMBridgeV2Contract.globalExitRootManager()).to.equal(polygonZkEVMGlobalExitRootAddress);
+ expect(await PolygonZkEVMBridgeV2Contract.polygonRollupManager()).to.equal(polygonRollupManagerAddress);
+ // Check already initialized
+ await expect(
+ PolygonZkEVMBridgeV2Contract.initialize(
+ 0,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ polygonZkEVMGlobalExitRootAddress,
+ polygonRollupManagerAddress,
+ "0x"
+ )
+ ).to.be.revertedWith("Initializable: contract is already initialized");
+ });
+});
diff --git a/docker/scripts/tools/check-docker-deploy.js b/docker/scripts/tools/check-docker-deploy.js
new file mode 100644
index 000000000..c21933bc4
--- /dev/null
+++ b/docker/scripts/tools/check-docker-deploy.js
@@ -0,0 +1,36 @@
+/* eslint-disable no-console */
+
+const ethers = require('ethers');
+require('dotenv').config();
+
+const rollupManagerAbi = require('../../../compiled-contracts/PolygonRollupManager.json').abi;
+
+async function main() {
+ const currentProvider = ethers.getDefaultProvider('http://localhost:8545');
+ const signerNode = await currentProvider.getSigner();
+
+ const rollupManagerContract = new ethers.Contract('0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e', rollupManagerAbi, signerNode);
+ const infoContract = await rollupManagerContract.rollupIDToRollupDataV2(1);
+ const info = {
+ rollupContract: infoContract[0],
+ chainID: infoContract[1],
+ verifier: infoContract[2],
+ forkID: infoContract[3],
+ lastLocalExitRoot: infoContract[4],
+ lastBatchSequenced: infoContract[5],
+ lastVerifiedBatch: infoContract[6],
+ lastVerifiedBatchBeforeUpgrade: infoContract[7],
+ rollupTypeID: infoContract[8],
+ rollupVerifierType: infoContract[9],
+ lastPessimisticRoot: infoContract[10],
+ programVKey: infoContract[11],
+ };
+ console.log(info);
+}
+
+main()
+ .then(() => process.exit(0))
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/docker/scripts/v2/create_rollup_parameters_docker.json b/docker/scripts/v2/create_rollup_parameters_docker.json
index dd19411bc..6f9a8d704 100644
--- a/docker/scripts/v2/create_rollup_parameters_docker.json
+++ b/docker/scripts/v2/create_rollup_parameters_docker.json
@@ -6,11 +6,20 @@
"trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"chainID": 1001,
"adminZkEVM": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
- "forkID": 8,
- "consensusContract": "PolygonZkEVMEtrog",
- "gasTokenAddress":"",
+ "forkID": 11,
+ "consensusContract": "PolygonPessimisticConsensus",
+ "gasTokenAddress": "deploy",
"deployerPvtKey": "",
- "maxFeePerGas":"",
- "maxPriorityFeePerGas":"",
- "multiplierGas": ""
+ "maxFeePerGas": "",
+ "maxPriorityFeePerGas": "",
+ "multiplierGas": "",
+ "programVKey": "0xac51a6a2e513d02e4f39ea51d4d133cec200b940805f1054eabbb6d6412c959f",
+ "isVanillaClient": false,
+ "sovereignParams": {
+ "bridgeManager": "0xC7899Ff6A3aC2FF59261bD960A8C880DF06E1041",
+ "sovereignWETHAddress": "0x0000000000000000000000000000000000000000",
+ "sovereignWETHAddressIsNotMintable": false,
+ "globalExitRootUpdater": "0xB55B27Cca633A73108893985350bc26B8A00C43a",
+ "globalExitRootRemover": "0xB55B27Cca633A73108893985350bc26B8A00C43a"
+ }
}
diff --git a/docker/scripts/v2/deploy-docker.sh b/docker/scripts/v2/deploy-docker.sh
index 54e679e68..1dde3f284 100755
--- a/docker/scripts/v2/deploy-docker.sh
+++ b/docker/scripts/v2/deploy-docker.sh
@@ -1,16 +1,27 @@
#!/bin/bash
+# Set the -e option to stop the script if any command fails
+set -e
+# Define cleanup function
+cleanup() {
+ sudo DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down
+}
+# Configure "trap" in case there's an error
+trap cleanup ERR
+
sudo rm -rf docker/gethData/geth_data
-DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml up -d geth
+sudo DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml up -d geth
sleep 5
node docker/scripts/fund-accounts.js
cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json
cp docker/scripts/v2/create_rollup_parameters_docker.json deployment/v2/create_rollup_parameters.json
npm run deploy:testnet:v2:localhost
+sudo rm -rf docker/deploymentOutput
mkdir docker/deploymentOutput
-mv deployment/v2/deploy_output.json docker/deploymentOutput
-mv deployment/v2/genesis.json docker/deploymentOutput
-mv deployment/v2/create_rollup_output.json docker/deploymentOutput
-DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down
-docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile .
+sudo mv deployment/v2/deploy_output.json docker/deploymentOutput
+sudo mv deployment/v2/genesis.json docker/deploymentOutput
+[ -f deployment/v2/genesis_sovereign.json ] && sudo mv deployment/v2/genesis_sovereign.json docker/deploymentOutput
+sudo mv deployment/v2/create_rollup_output.json docker/deploymentOutput
+sudo DEV_PERIOD=1 docker-compose -f docker/docker-compose.yml down
+sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile .
# Let it readable for the multiplatform build coming later!
sudo chmod -R go+rxw docker/gethData
diff --git a/docker/scripts/v2/deploy-dockerv2.sh b/docker/scripts/v2/deploy-dockerv2.sh
index 75dba6775..406c16051 100755
--- a/docker/scripts/v2/deploy-dockerv2.sh
+++ b/docker/scripts/v2/deploy-dockerv2.sh
@@ -1,16 +1,27 @@
#!/bin/bash
+# Set the -e option to stop the script if any command fails
+set -e
+# Define cleanup function
+cleanup() {
+ sudo DEV_PERIOD=1 docker compose -f docker/docker-compose.yml down
+}
+# Configure "trap" in case there's an error
+trap cleanup ERR
+
sudo rm -rf docker/gethData/geth_data
-DEV_PERIOD=1 docker compose -f docker/docker-compose.yml up -d geth
+sudo DEV_PERIOD=1 docker compose -f docker/docker-compose.yml up -d geth
sleep 5
node docker/scripts/fund-accounts.js
cp docker/scripts/v2/deploy_parameters_docker.json deployment/v2/deploy_parameters.json
cp docker/scripts/v2/create_rollup_parameters_docker.json deployment/v2/create_rollup_parameters.json
npm run deploy:testnet:v2:localhost
+sudo rm -rf docker/deploymentOutput
mkdir docker/deploymentOutput
-mv deployment/v2/deploy_output.json docker/deploymentOutput
-mv deployment/v2/genesis.json docker/deploymentOutput
-mv deployment/v2/create_rollup_output.json docker/deploymentOutput
-DEV_PERIOD=1 docker compose -f docker/docker-compose.yml down
-docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile .
+sudo mv deployment/v2/deploy_output.json docker/deploymentOutput
+sudo mv deployment/v2/genesis.json docker/deploymentOutput
+[ -f deployment/v2/genesis_sovereign.json ] && sudo mv deployment/v2/genesis_sovereign.json docker/deploymentOutput
+sudo mv deployment/v2/create_rollup_output.json docker/deploymentOutput
+sudo DEV_PERIOD=1 docker compose -f docker/docker-compose.yml down
+sudo docker build -t hermeznetwork/geth-zkevm-contracts -f docker/Dockerfile .
# Let it readable for the multiplatform build coming later!
sudo chmod -R go+rxw docker/gethData
\ No newline at end of file
diff --git a/docker/scripts/v2/deploy_parameters_docker.json b/docker/scripts/v2/deploy_parameters_docker.json
index b58f28476..2e810bf78 100644
--- a/docker/scripts/v2/deploy_parameters_docker.json
+++ b/docker/scripts/v2/deploy_parameters_docker.json
@@ -11,8 +11,6 @@
"emergencyCouncilAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"polTokenAddress": "",
"zkEVMDeployerAddress": "",
- "gasTokenAddress": "",
- "gasTokenNetwork": 0,
"deployerPvtKey": "",
"maxFeePerGas": "",
"maxPriorityFeePerGas": "",
diff --git a/docker/scripts/v2/tests-docker.sh b/docker/scripts/v2/tests-docker.sh
new file mode 100755
index 000000000..d154886c7
--- /dev/null
+++ b/docker/scripts/v2/tests-docker.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+# Set the -e option to stop the script if any command fails
+set -e
+# Run docker tests
+# Run container
+docker run -p 8545:8545 -d --name docker_test hermeznetwork/geth-zkevm-contracts
+# Run docker tests
+npx hardhat test docker/docker-tests.test.ts --network localhost
+# Run tooling tests to docker
+npx hardhat test docker/tools-docker-tests.test.ts --network localhost
+# stop container
+docker stop docker_test
+# remove container
+docker container rm docker_test
\ No newline at end of file
diff --git a/docker/tools-docker-tests.test.ts b/docker/tools-docker-tests.test.ts
new file mode 100644
index 000000000..ae0df9fc8
--- /dev/null
+++ b/docker/tools-docker-tests.test.ts
@@ -0,0 +1,151 @@
+import {expect} from "chai";
+import {ethers} from "hardhat";
+import fs from "fs";
+import path from "path";
+import shelljs from "shelljs";
+import {ConsensusContracts} from "../src/pessimistic-utils";
+
+const deployOutput = JSON.parse(fs.readFileSync(path.join(__dirname, "./deploymentOutput/deploy_output.json"), "utf8"));
+const {polygonRollupManagerAddress, polygonZkEVMBridgeAddress, polygonZkEVMGlobalExitRootAddress, polTokenAddress} =
+ deployOutput;
+const createRollupOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/create_rollup_output.json"), "utf8")
+);
+const {rollupAddress} = createRollupOutput;
+import {
+ PolygonRollupManager,
+ PolygonPessimisticConsensus,
+ PolygonValidiumEtrog,
+ PolygonZkEVMEtrog,
+} from "../typechain-types";
+
+describe("Tooling docker build tests Contract", () => {
+ it("Create a new rollup", async () => {
+ // Read docker deployment output
+ const dockerCreateRollupOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/create_rollup_output.json"), "utf8")
+ );
+ const dockerDeploymentOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/deploy_output.json"), "utf8")
+ );
+ // Read create rollup config file
+ const createRollupConfig = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "../tools/createNewRollup/create_new_rollup.json.example"), "utf8")
+ );
+
+ // Update example config from docker deployment output
+ createRollupConfig.consensusContractName = dockerCreateRollupOutput.consensusContract;
+ createRollupConfig.gasTokenAddress = dockerCreateRollupOutput.gasTokenAddress;
+ createRollupConfig.outputPath = "create_new_rollup_output.json";
+ createRollupConfig.chainID = 12;
+ createRollupConfig.rollupManagerAddress = dockerDeploymentOutput.polygonRollupManagerAddress;
+ fs.writeFileSync(
+ path.join(__dirname, "../tools/createNewRollup/create_new_rollup.json"),
+ JSON.stringify(createRollupConfig, null, 2)
+ );
+
+ // Run tool
+ shelljs.exec("npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network localhost");
+
+ // Read create rollup output
+ const createRollupOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "../tools/createNewRollup/create_new_rollup_output.json"), "utf8")
+ );
+ // Check output values with current docker environment
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
+ createRollupOutput.rollupManagerAddress
+ ) as PolygonRollupManager;
+
+ expect(createRollupConfig.rollupManagerAddress).to.equal(rollupManagerContract.target);
+ // Get rollup data
+ const rollupId = await rollupManagerContract.rollupAddressToID(createRollupOutput.rollupAddress);
+ expect(Number(rollupId)).to.equal(createRollupOutput.rollupID);
+ expect(await rollupManagerContract.chainIDToRollupID(createRollupConfig.chainID)).to.equal(
+ createRollupOutput.rollupID
+ );
+ const rollupFactory = (await ethers.getContractFactory(createRollupConfig.consensusContractName)) as any;
+ let rollupContract;
+ switch (createRollupConfig.consensusContractName) {
+ case ConsensusContracts.PolygonZkEVMEtrog:
+ rollupContract = rollupFactory.attach(createRollupOutput.rollupAddress) as PolygonZkEVMEtrog;
+ break;
+ case ConsensusContracts.PolygonValidiumEtrog:
+ rollupContract = rollupFactory.attach(createRollupOutput.rollupAddress) as PolygonValidiumEtrog;
+ break;
+ case ConsensusContracts.PolygonPessimisticConsensus:
+ rollupContract = rollupFactory.attach(createRollupOutput.rollupAddress) as PolygonPessimisticConsensus;
+ break;
+ default:
+ throw new Error("Invalid consensus contract");
+ }
+
+ expect(await rollupContract.rollupManager()).to.equal(createRollupConfig.rollupManagerAddress);
+ expect(await rollupContract.gasTokenAddress()).to.equal(createRollupConfig.gasTokenAddress);
+ expect(await rollupContract.trustedSequencer()).to.equal(createRollupConfig.trustedSequencer);
+ });
+
+ it("Create a new rollup type", async () => {
+ // Read docker deployment output
+ const dockerCreateRollupOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/create_rollup_output.json"), "utf8")
+ );
+ const dockerDeploymentOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "./deploymentOutput/deploy_output.json"), "utf8")
+ );
+ // Read create rollup config file
+ const createRollupTypeConfig = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "../tools/addRollupType/add_rollup_type.json.example"), "utf8")
+ );
+
+ // Update example config from docker deployment output
+ createRollupTypeConfig.consensusContract = dockerCreateRollupOutput.consensusContract;
+ createRollupTypeConfig.polygonRollupManagerAddress = dockerCreateRollupOutput.rollupManagerAddress;
+ createRollupTypeConfig.verifierAddress = dockerCreateRollupOutput.verifierAddress;
+ if (dockerCreateRollupOutput.consensusContract === ConsensusContracts.PolygonPessimisticConsensus) {
+ createRollupTypeConfig.genesisRoot = ethers.ZeroHash;
+ createRollupTypeConfig.programVKey = dockerCreateRollupOutput.programVKey;
+ } else {
+ createRollupTypeConfig.genesisRoot = dockerCreateRollupOutput.genesis;
+ createRollupTypeConfig.programVKey = ethers.ZeroHash;
+ }
+
+ createRollupTypeConfig.polygonRollupManagerAddress = dockerDeploymentOutput.polygonRollupManagerAddress;
+ createRollupTypeConfig.outputPath = "add_rollup_type_output.json";
+ fs.writeFileSync(
+ path.join(__dirname, "../tools/addRollupType/add_rollup_type.json"),
+ JSON.stringify(createRollupTypeConfig, null, 2)
+ );
+
+ // Copy genesis file
+ fs.copyFileSync(
+ path.join(__dirname, "../tools/addRollupType/genesis.json.example"),
+ path.join(__dirname, "../tools/addRollupType/genesis.json")
+ );
+ // Run tool
+ shelljs.exec("npx hardhat run ./tools/addRollupType/addRollupType.ts --network localhost");
+
+ // Read create rollup output
+ const createRollupTypeOutput = JSON.parse(
+ fs.readFileSync(path.join(__dirname, "../tools/addRollupType/add_rollup_type_output.json"), "utf8")
+ );
+ // Check output values with current docker environment
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
+ dockerDeploymentOutput.polygonRollupManagerAddress
+ ) as PolygonRollupManager;
+
+ const rollupType = await rollupManagerContract.rollupTypeMap(Number(createRollupTypeOutput.rollupTypeID));
+
+ // Consensus contract address
+ expect(rollupType[0]).to.equal(createRollupTypeOutput.consensusContractAddress);
+ // verifier address
+ expect(rollupType[1]).to.equal(createRollupTypeConfig.verifierAddress);
+ // ForkID
+ expect(Number(rollupType[2])).to.equal(createRollupTypeConfig.forkID);
+ // Genesis root
+ expect(rollupType[5]).to.equal(createRollupTypeConfig.genesisRoot);
+ // Program VKey
+ expect(rollupType[6]).to.equal(createRollupTypeConfig.programVKey);
+ });
+});
diff --git a/docs/L2/PolygonZkEVMBridgeL2.md b/docs/L2/PolygonZkEVMBridgeL2.md
deleted file mode 100644
index 435aca286..000000000
--- a/docs/L2/PolygonZkEVMBridgeL2.md
+++ /dev/null
@@ -1,364 +0,0 @@
-PolygonZkEVMBridge that will be deployed on both networks Ethereum and Polygon zkEVM
-Contract responsible to manage the token interactions with other networks
-
-
-## Functions
-### initialize
-```solidity
- function initialize(
- uint32 _networkID,
- contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager,
- address _polygonZkEVMaddress
- ) external
-```
-The value of `_polygonZkEVMaddress` on the L2 deployment of the contract will be address(0), so
-emergency state is not possible for the L2 deployment of the bridge, intentionally
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_networkID` | uint32 | networkID
-|`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address
-|`_polygonZkEVMaddress` | address | polygonZkEVM address
-
-
-### bridgeAsset
-```solidity
- function bridgeAsset(
- uint32 destinationNetwork,
- address destinationAddress,
- uint256 amount,
- address token,
- bool forceUpdateGlobalExitRoot,
- bytes permitData
- ) public
-```
-Deposit add a new leaf to the merkle tree
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`destinationNetwork` | uint32 | Network destination
-|`destinationAddress` | address | Address destination
-|`amount` | uint256 | Amount of tokens
-|`token` | address | Token address, 0 address is reserved for ether
-|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not
-|`permitData` | bytes | Raw data of the call `permit` of the token
-
-### bridgeMessage
-```solidity
- function bridgeMessage(
- uint32 destinationNetwork,
- address destinationAddress,
- uint256 amountWETH,
- bool forceUpdateGlobalExitRoot,
- bytes metadata
- ) external
-```
-Bridge message and send ETH value
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`destinationNetwork` | uint32 | Network destination
-|`destinationAddress` | address | Address destination
-|`amountWETH` | uint256 | Amount of WETH tokens
-|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not
-|`metadata` | bytes | Message metadata
-
-### claimAsset
-```solidity
- function claimAsset(
- bytes32[32] smtProof,
- uint32 index,
- bytes32 mainnetExitRoot,
- bytes32 rollupExitRoot,
- uint32 originNetwork,
- address originTokenAddress,
- uint32 destinationNetwork,
- address destinationAddress,
- uint256 amount,
- bytes metadata
- ) external
-```
-Verify merkle proof and withdraw tokens/ether
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-|`mainnetExitRoot` | bytes32 | Mainnet exit root
-|`rollupExitRoot` | bytes32 | Rollup exit root
-|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
-|`destinationNetwork` | uint32 | Network destination
-|`destinationAddress` | address | Address destination
-|`amount` | uint256 | Amount of tokens
-|`metadata` | bytes | Abi encoded metadata if any, empty otherwise
-
-### claimMessage
-```solidity
- function claimMessage(
- bytes32[32] smtProof,
- uint32 index,
- bytes32 mainnetExitRoot,
- bytes32 rollupExitRoot,
- uint32 originNetwork,
- address originAddress,
- uint32 destinationNetwork,
- address destinationAddress,
- uint256 amount,
- bytes metadata
- ) external
-```
-Verify merkle proof and execute message
-If the receiving address is an EOA, the call will result as a success
-Which means that the amount of ether will be transferred correctly, but the message
-will not trigger any execution
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-|`mainnetExitRoot` | bytes32 | Mainnet exit root
-|`rollupExitRoot` | bytes32 | Rollup exit root
-|`originNetwork` | uint32 | Origin network
-|`originAddress` | address | Origin address
-|`destinationNetwork` | uint32 | Network destination
-|`destinationAddress` | address | Address destination
-|`amount` | uint256 | message value
-|`metadata` | bytes | Abi encoded metadata if any, empty otherwise
-
-### precalculatedWrapperAddress
-```solidity
- function precalculatedWrapperAddress(
- uint32 originNetwork,
- address originTokenAddress,
- string name,
- string symbol,
- uint8 decimals
- ) external returns (address)
-```
-Returns the precalculated address of a wrapper using the token information
-Note Updating the metadata of a token is not supported.
-Since the metadata has relevance in the address deployed, this function will not return a valid
-wrapped address if the metadata provided is not the original one.
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
-|`name` | string | Name of the token
-|`symbol` | string | Symbol of the token
-|`decimals` | uint8 | Decimals of the token
-
-### getTokenWrappedAddress
-```solidity
- function getTokenWrappedAddress(
- uint32 originNetwork,
- address originTokenAddress
- ) external returns (address)
-```
-Returns the address of a wrapper using the token information if already exist
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
-
-### activateEmergencyState
-```solidity
- function activateEmergencyState(
- ) external
-```
-Function to activate the emergency state
- " Only can be called by the Polygon ZK-EVM in extreme situations
-
-
-
-### deactivateEmergencyState
-```solidity
- function deactivateEmergencyState(
- ) external
-```
-Function to deactivate the emergency state
- " Only can be called by the Polygon ZK-EVM
-
-
-
-### _verifyLeaf
-```solidity
- function _verifyLeaf(
- bytes32[32] smtProof,
- uint32 index,
- bytes32 mainnetExitRoot,
- bytes32 rollupExitRoot,
- uint32 originNetwork,
- address originAddress,
- uint32 destinationNetwork,
- address destinationAddress,
- uint256 amount,
- bytes metadata,
- uint8 leafType
- ) internal
-```
-Verify leaf and checks that it has not been claimed
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-|`mainnetExitRoot` | bytes32 | Mainnet exit root
-|`rollupExitRoot` | bytes32 | Rollup exit root
-|`originNetwork` | uint32 | Origin network
-|`originAddress` | address | Origin address
-|`destinationNetwork` | uint32 | Network destination
-|`destinationAddress` | address | Address destination
-|`amount` | uint256 | Amount of tokens
-|`metadata` | bytes | Abi encoded metadata if any, empty otherwise
-|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message
-
-### isClaimed
-```solidity
- function isClaimed(
- uint256 index
- ) external returns (bool)
-```
-Function to check if an index is claimed or not
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`index` | uint256 | Index
-
-### updateGlobalExitRoot
-```solidity
- function updateGlobalExitRoot(
- ) external
-```
-Function to update the globalExitRoot if the last deposit is not submitted
-
-
-
-### _updateGlobalExitRoot
-```solidity
- function _updateGlobalExitRoot(
- ) internal
-```
-Function to update the globalExitRoot
-
-
-
-### _permit
-```solidity
- function _permit(
- address amount,
- uint256 permitData
- ) internal
-```
-Function to call token permit method of extended ERC20
- + @param token ERC20 token address
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`amount` | address | Quantity that is expected to be allowed
-|`permitData` | uint256 | Raw data of the call `permit` of the token
-
-### _safeSymbol
-```solidity
- function _safeSymbol(
- address token
- ) internal returns (string)
-```
-Provides a safe ERC20.symbol version which returns 'NO_SYMBOL' as fallback string
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`token` | address | The address of the ERC-20 token contract
-
-### _safeName
-```solidity
- function _safeName(
- address token
- ) internal returns (string)
-```
- Provides a safe ERC20.name version which returns 'NO_NAME' as fallback string.
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`token` | address | The address of the ERC-20 token contract.
-
-### _safeDecimals
-```solidity
- function _safeDecimals(
- address token
- ) internal returns (uint8)
-```
-Provides a safe ERC20.decimals version which returns '18' as fallback value.
-Note Tokens with (decimals > 255) are not supported
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`token` | address | The address of the ERC-20 token contract
-
-### _returnDataToString
-```solidity
- function _returnDataToString(
- bytes data
- ) internal returns (string)
-```
-Function to convert returned data to string
-returns 'NOT_VALID_ENCODING' as fallback value.
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`data` | bytes | returned data
-
-## Events
-### BridgeEvent
-```solidity
- event BridgeEvent(
- )
-```
-
-Emitted when bridge assets or messages to another network
-
-### ClaimEvent
-```solidity
- event ClaimEvent(
- )
-```
-
-Emitted when a claim is done from another network
-
-### NewWrappedToken
-```solidity
- event NewWrappedToken(
- )
-```
-
-Emitted when a new wrapped token is created
-
diff --git a/docs/PolygonZkEVMBridge.md b/docs/PolygonZkEVMBridge.md
index 5a94edf48..a0d9bc9ce 100644
--- a/docs/PolygonZkEVMBridge.md
+++ b/docs/PolygonZkEVMBridge.md
@@ -46,7 +46,7 @@ do not call any external address in that case
|`destinationNetwork` | uint32 | Network destination
|`destinationAddress` | address | Address destination
|`amount` | uint256 | Amount of tokens
-|`token` | address | Token address, 0 address is reserved for ether
+|`token` | address | Token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not
|`permitData` | bytes | Raw data of the call `permit` of the token
@@ -96,7 +96,7 @@ Verify merkle proof and withdraw tokens/ether
|`mainnetExitRoot` | bytes32 | Mainnet exit root
|`rollupExitRoot` | bytes32 | Rollup exit root
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`destinationNetwork` | uint32 | Network destination
|`destinationAddress` | address | Address destination
|`amount` | uint256 | Amount of tokens
@@ -157,7 +157,7 @@ wrapped address if the metadata provided is not the original one.
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`name` | string | Name of the token
|`symbol` | string | Symbol of the token
|`decimals` | uint8 | Decimals of the token
@@ -176,7 +176,7 @@ Returns the address of a wrapper using the token information if already exist
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
### activateEmergencyState
```solidity
diff --git a/docs/lib/DepositContractLib.md b/docs/lib/DepositContractLib.md
deleted file mode 100644
index 98d0b10b3..000000000
--- a/docs/lib/DepositContractLib.md
+++ /dev/null
@@ -1,66 +0,0 @@
-This contract will be used as a helper for all the sparse merkle tree related functions
-Based on the implementation of the deposit eth2.0 contract https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol
-
-
-## Functions
-### getRoot
-```solidity
- function getRoot(
- ) public returns (bytes32)
-```
-Computes and returns the merkle root
-
-
-
-### _addLeaf
-```solidity
- function _addLeaf(
- bytes32 leaf
- ) internal
-```
-Add a new leaf to the merkle tree
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`leaf` | bytes32 | Leaf
-
-### verifyMerkleProof
-```solidity
- function verifyMerkleProof(
- bytes32 leafHash,
- bytes32[32] smtProof,
- uint32 index,
- bytes32 root
- ) public returns (bool)
-```
-Verify merkle proof
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`leafHash` | bytes32 | Leaf hash
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-|`root` | bytes32 | Merkle root
-
-### calculateRoot
-```solidity
- function calculateRoot(
- bytes32 leafHash,
- bytes32[32] smtProof,
- uint32 index
- ) public returns (bytes32)
-```
-calcualte root from merkle proof
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`leafHash` | bytes32 | Leaf hash
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-
diff --git a/docs/selectors.txt b/docs/selectors.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/L2/WETHzkEVM.md b/docs/token-wrapped-bridge/TokenWrappedBridge.md
similarity index 82%
rename from docs/L2/WETHzkEVM.md
rename to docs/token-wrapped-bridge/TokenWrappedBridge.md
index b75e00ada..44107d840 100644
--- a/docs/L2/WETHzkEVM.md
+++ b/docs/token-wrapped-bridge/TokenWrappedBridge.md
@@ -29,6 +29,15 @@
+### decimals
+```solidity
+ function decimals(
+ ) public returns (uint8)
+```
+
+
+
+
### permit
```solidity
function permit(
diff --git a/docs/v2/PolygonRollupManager.md b/docs/v2/PolygonRollupManager.md
index 9b06af222..17d48c670 100644
--- a/docs/v2/PolygonRollupManager.md
+++ b/docs/v2/PolygonRollupManager.md
@@ -25,42 +25,22 @@ them will be done in this one. In this way, the proof aggregation of the rollups
### initialize
```solidity
function initialize(
- address trustedAggregator,
- uint64 _pendingStateTimeout,
- uint64 _trustedAggregatorTimeout,
- address admin,
- address timelock,
- address emergencyCouncil,
- contract PolygonZkEVMExistentEtrog polygonZkEVM,
- contract IVerifierRollup zkEVMVerifier,
- uint64 zkEVMForkID,
- uint64 zkEVMChainID
) external
```
+Initializer function to set new rollup manager version
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`trustedAggregator` | address | Trusted aggregator address
-|`_pendingStateTimeout` | uint64 | Pending state timeout
-|`_trustedAggregatorTimeout` | uint64 | Trusted aggregator timeout
-|`admin` | address | Admin of the rollup manager
-|`timelock` | address | Timelock address
-|`emergencyCouncil` | address | Emergency council address
-|`polygonZkEVM` | contract PolygonZkEVMExistentEtrog | New deployed Polygon zkEVM which will be initialized wiht previous values
-|`zkEVMVerifier` | contract IVerifierRollup | Verifier of the new zkEVM deployed
-|`zkEVMForkID` | uint64 | Fork id of the new zkEVM deployed
-|`zkEVMChainID` | uint64 | Chain id of the new zkEVM deployed
### addNewRollupType
```solidity
function addNewRollupType(
address consensusImplementation,
- contract IVerifierRollup verifier,
+ address verifier,
uint64 forkID,
- uint8 genesis,
- bytes32 description
+ enum IPolygonRollupManager.VerifierType rollupVerifierType,
+ bytes32 genesis,
+ string description,
+ bytes32 programVKey
) external
```
Add a new rollup type
@@ -70,10 +50,12 @@ Add a new rollup type
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`consensusImplementation` | address | Consensus implementation
-|`verifier` | contract IVerifierRollup | Verifier address
+|`verifier` | address | Verifier address
|`forkID` | uint64 | ForkID of the verifier
-|`genesis` | uint8 | Genesis block of the rollup
-|`description` | bytes32 | Description of the rollup type
+|`rollupVerifierType` | enum IPolygonRollupManager.VerifierType | rollup verifier type
+|`genesis` | bytes32 | Genesis block of the rollup
+|`description` | string | Description of the rollup type
+|`programVKey` | bytes32 | Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
### obsoleteRollupType
```solidity
@@ -108,7 +90,7 @@ Create a new rollup
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollupTypeID` | uint32 | Rollup type to deploy
-|`chainID` | uint64 | ChainID of the rollup, must be a new one
+|`chainID` | uint64 | ChainID of the rollup, must be a new one, can not have more than 32 bits
|`admin` | address | Admin of the new created rollup
|`sequencer` | address | Sequencer of the new created rollup
|`gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
@@ -120,11 +102,12 @@ Note if a wrapped token of the bridge is used, the original network and address
```solidity
function addExistingRollup(
contract IPolygonRollupBase rollupAddress,
- contract IVerifierRollup verifier,
+ address verifier,
uint64 forkID,
uint64 chainID,
- bytes32 genesis,
- uint8 rollupCompatibilityID
+ bytes32 initRoot,
+ enum IPolygonRollupManager.VerifierType rollupVerifierType,
+ bytes32 programVKey
) external
```
Add an already deployed rollup
@@ -135,36 +118,29 @@ note that this rollup does not follow any rollupType
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollupAddress` | contract IPolygonRollupBase | Rollup address
-|`verifier` | contract IVerifierRollup | Verifier address, must be added before
+|`verifier` | address | Verifier address, must be added before
|`forkID` | uint64 | Fork id of the added rollup
|`chainID` | uint64 | Chain id of the added rollup
-|`genesis` | bytes32 | Genesis block for this rollup
-|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
+|`initRoot` | bytes32 | Genesis block for StateTransitionChains & localExitRoot for pessimistic chain
+|`rollupVerifierType` | enum IPolygonRollupManager.VerifierType | Compatibility ID for the added rollup
+|`programVKey` | bytes32 | Hashed program that will be executed in case of using a "general purpose ZK verifier" e.g SP1
-### _addExistingRollup
+### updateRollupByRollupAdmin
```solidity
- function _addExistingRollup(
- contract IPolygonRollupBase rollupAddress,
- contract IVerifierRollup verifier,
- uint64 forkID,
- uint64 chainID,
- uint8 rollupCompatibilityID,
- uint64 lastVerifiedBatch
- ) internal returns (struct PolygonRollupManager.RollupData rollup)
+ function updateRollupByRollupAdmin(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID
+ ) external
```
-Add an already deployed rollup
-note that this rollup does not follow any rollupType
+Upgrade an existing rollup from the rollup admin address
+This address is able to udpate the rollup with more restrictions that the _UPDATE_ROLLUP_ROLE
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
-|`rollupAddress` | contract IPolygonRollupBase | Rollup address
-|`verifier` | contract IVerifierRollup | Verifier address, must be added before
-|`forkID` | uint64 | Fork id of the added rollup
-|`chainID` | uint64 | Chain id of the added rollup
-|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
-|`lastVerifiedBatch` | uint64 | Last verified batch before adding the rollup
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
### updateRollup
```solidity
@@ -184,49 +160,56 @@ Upgrade an existing rollup
|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
|`upgradeData` | bytes | Upgrade data
-### onSequenceBatches
+### _updateRollup
```solidity
- function onSequenceBatches(
- uint64 newSequencedBatches,
- bytes32 newAccInputHash
- ) external returns (uint64)
+ function _updateRollup(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes upgradeData
+ ) internal
```
-Sequence batches, callback called by one of the consensus managed by this contract
+Upgrade an existing rollup
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
-|`newSequencedBatches` | uint64 | Number of batches sequenced
-|`newAccInputHash` | bytes32 | New accumulate input hash
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
+|`upgradeData` | bytes | Upgrade data
-### verifyBatches
+### rollbackBatches
```solidity
- function verifyBatches(
- uint32 rollupID,
- uint64 pendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- address beneficiary,
- bytes32[24] proof
+ function rollbackBatches(
+ contract IPolygonRollupBase rollupContract,
+ uint64 targetBatch
) external
```
-Allows an aggregator to verify multiple batches
+Rollback batches of the target rollup
+Only applies to state transition rollups
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
-|`rollupID` | uint32 | Rollup identifier
-|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
-|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
-|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
-|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
-|`newStateRoot` | bytes32 | New State root once the batch is processed
-|`beneficiary` | address | Address that will receive the verification reward
-|`proof` | bytes32[24] | Fflonk proof
+|`rollupContract` | contract IPolygonRollupBase | Rollup consensus proxy address
+|`targetBatch` | uint64 | Batch to rollback up to but not including this batch
+
+### onSequenceBatches
+```solidity
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external returns (uint64)
+```
+Sequence batches, callback called by one of the consensus managed by this contract
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newSequencedBatches` | uint64 | Number of batches sequenced
+|`newAccInputHash` | bytes32 | New accumulate input hash
### verifyBatchesTrustedAggregator
```solidity
@@ -248,7 +231,7 @@ Allows a trusted aggregator to verify multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollupID` | uint32 | Rollup identifier
-|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used (deprecated)
|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
@@ -260,7 +243,6 @@ Allows a trusted aggregator to verify multiple batches
```solidity
function _verifyAndRewardBatches(
struct PolygonRollupManager.RollupData rollup,
- uint64 pendingStateNum,
uint64 initNumBatch,
uint64 finalNewBatch,
bytes32 newLocalExitRoot,
@@ -276,7 +258,6 @@ Verify and reward batches internal function
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data storage pointer that will be used to the verification
-|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
@@ -284,148 +265,27 @@ Verify and reward batches internal function
|`beneficiary` | address | Address that will receive the verification reward
|`proof` | bytes32[24] | Fflonk proof
-### _tryConsolidatePendingState
-```solidity
- function _tryConsolidatePendingState(
- ) internal
-```
-Internal function to consolidate the state automatically once sequence or verify batches are called
-It tries to consolidate the first and the middle pending state in the queue
-
-
-
-### consolidatePendingState
-```solidity
- function consolidatePendingState(
- uint32 rollupID,
- uint64 pendingStateNum
- ) external
-```
-Allows to consolidate any pending state that has already exceed the pendingStateTimeout
-Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollupID` | uint32 | Rollup identifier
-|`pendingStateNum` | uint64 | Pending state to consolidate
-
-### _consolidatePendingState
-```solidity
- function _consolidatePendingState(
- struct PolygonRollupManager.RollupData rollup,
- uint64 pendingStateNum
- ) internal
-```
-Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer
-|`pendingStateNum` | uint64 | Pending state to consolidate
-
-### overridePendingState
-```solidity
- function overridePendingState(
- uint32 rollupID,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] proof
- ) external
-```
-Allows the trusted aggregator to override the pending state
-if it's possible to prove a different state root given the same batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollupID` | uint32 | Rollup identifier
-|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
-|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
-|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
-|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
-|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
-|`newStateRoot` | bytes32 | New State root once the batch is processed
-|`proof` | bytes32[24] | Fflonk proof
-
-### proveNonDeterministicPendingState
+### verifyPessimisticTrustedAggregator
```solidity
- function proveNonDeterministicPendingState(
+ function verifyPessimisticTrustedAggregator(
uint32 rollupID,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
+ uint32 l1InfoTreeLeafCount,
bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] proof
+ bytes32 newPessimisticRoot,
+ bytes proof
) external
```
-Allows activate the emergency state if its possible to prove a different state root given the same batches
+Allows a trusted aggregator to verify pessimistic proof
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollupID` | uint32 | Rollup identifier
-|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
-|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
-|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
-|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
-|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
-|`newStateRoot` | bytes32 | New State root once the batch is processed
-|`proof` | bytes32[24] | Fflonk proof
-
-### _proveDistinctPendingState
-```solidity
- function _proveDistinctPendingState(
- struct PolygonRollupManager.RollupData rollup,
- uint64 initPendingStateNum,
- uint64 finalPendingStateNum,
- uint64 initNumBatch,
- uint64 finalNewBatch,
- bytes32 newLocalExitRoot,
- bytes32 newStateRoot,
- bytes32[24] proof
- ) internal
-```
-Internal function that proves a different state root given the same batches to verify
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollup` | struct PolygonRollupManager.RollupData | Rollup Data struct that will be checked
-|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
-|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
-|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
-|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
-|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
-|`newStateRoot` | bytes32 | New State root once the batch is processed
-|`proof` | bytes32[24] | Fflonk proof
-
-### _updateBatchFee
-```solidity
- function _updateBatchFee(
- struct PolygonRollupManager.RollupData newLastVerifiedBatch
- ) internal
-```
-Function to update the batch fee based on the new verified batches
-The batch fee will not be updated when the trusted aggregator verifies batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newLastVerifiedBatch` | struct PolygonRollupManager.RollupData | New last verified batch
+|`l1InfoTreeLeafCount` | uint32 | Count of the L1InfoTree leaf that will be used to verify imported bridge exits
+|`newLocalExitRoot` | bytes32 | New local exit root
+|`newPessimisticRoot` | bytes32 | New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+|`proof` | bytes | SP1 proof (Plonk)
### activateEmergencyState
```solidity
@@ -455,66 +315,6 @@ Internal function to activate emergency state on both PolygonRollupManager and P
-### setTrustedAggregatorTimeout
-```solidity
- function setTrustedAggregatorTimeout(
- uint64 newTrustedAggregatorTimeout
- ) external
-```
-Set a new pending state timeout
-The timeout can only be lowered, except if emergency state is active
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedAggregatorTimeout` | uint64 | Trusted aggregator timeout
-
-### setPendingStateTimeout
-```solidity
- function setPendingStateTimeout(
- uint64 newPendingStateTimeout
- ) external
-```
-Set a new trusted aggregator timeout
-The timeout can only be lowered, except if emergency state is active
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newPendingStateTimeout` | uint64 | Trusted aggregator timeout
-
-### setMultiplierBatchFee
-```solidity
- function setMultiplierBatchFee(
- uint16 newMultiplierBatchFee
- ) external
-```
-Set a new multiplier batch fee
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newMultiplierBatchFee` | uint16 | multiplier batch fee
-
-### setVerifyBatchTimeTarget
-```solidity
- function setVerifyBatchTimeTarget(
- uint64 newVerifyBatchTimeTarget
- ) external
-```
-Set a new verify batch time target
-This value will only be relevant once the aggregation is decentralized, so
-the trustedAggregatorTimeout should be zero or very close to zero
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newVerifyBatchTimeTarget` | uint64 | Verify batch time target
-
### setBatchFee
```solidity
function setBatchFee(
@@ -560,40 +360,6 @@ Get the last verified batch
-### isPendingStateConsolidable
-```solidity
- function isPendingStateConsolidable(
- uint32 rollupID,
- uint64 pendingStateNum
- ) public returns (bool)
-```
-Returns a boolean that indicates if the pendingStateNum is or not consolidable
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollupID` | uint32 | Rollup id
-|`pendingStateNum` | uint64 | Pending state number to check
-Note that his function does not check if the pending state currently exists, or if it's consolidated already
-
-### _isPendingStateConsolidable
-```solidity
- function _isPendingStateConsolidable(
- struct PolygonRollupManager.RollupData rollup,
- uint64 pendingStateNum
- ) internal returns (bool)
-```
-Returns a boolean that indicates if the pendingStateNum is or not consolidable
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer
-|`pendingStateNum` | uint64 | Pending state number to check
-Note that his function does not check if the pending state currently exists, or if it's consolidated already
-
### calculateRewardPerBatch
```solidity
function calculateRewardPerBatch(
@@ -623,6 +389,48 @@ Get forced batch fee
+### getInputPessimisticBytes
+```solidity
+ function getInputPessimisticBytes(
+ uint32 rollupID,
+ bytes32 l1InfoTreeRoot,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot
+ ) external returns (bytes)
+```
+Function to calculate the pessimistic input bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup id used to calculate the input snark bytes
+|`l1InfoTreeRoot` | bytes32 | L1 Info tree root to proof imported bridges
+|`newLocalExitRoot` | bytes32 | New local exit root
+|`newPessimisticRoot` | bytes32 | New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+
+### _getInputPessimisticBytes
+```solidity
+ function _getInputPessimisticBytes(
+ uint32 rollupID,
+ struct PolygonRollupManager.RollupData rollup,
+ bytes32 l1InfoTreeRoot,
+ bytes32 newLocalExitRoot,
+ bytes32 newPessimisticRoot
+ ) internal returns (bytes)
+```
+Function to calculate the input snark bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`rollup` | struct PolygonRollupManager.RollupData | Rollup data storage pointer
+|`l1InfoTreeRoot` | bytes32 | L1 Info tree root to proof imported bridges
+|`newLocalExitRoot` | bytes32 | New local exit root
+|`newPessimisticRoot` | bytes32 | New pessimistic information, Hash(localBalanceTreeRoot, nullifierTreeRoot)
+
### getInputSnarkBytes
```solidity
function getInputSnarkBytes(
@@ -717,21 +525,33 @@ Get rollup sequence batches struct given a batch number
|`rollupID` | uint32 | Rollup identifier
|`batchNum` | uint64 | Batch number
-### getRollupPendingStateTransitions
+### rollupIDToRollupData
```solidity
- function getRollupPendingStateTransitions(
- uint32 rollupID,
- uint64 batchNum
- ) public returns (struct LegacyZKEVMStateVariables.PendingState)
+ function rollupIDToRollupData(
+ uint32 rollupID
+ ) public returns (struct PolygonRollupManager.RollupDataReturn rollupData)
```
-Get rollup sequence pending state struct given a batch number
+Get rollup data: VerifierType StateTransition
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+
+### rollupIDToRollupDataV2
+```solidity
+ function rollupIDToRollupDataV2(
+ uint32 rollupID
+ ) public returns (struct PolygonRollupManager.RollupDataReturnV2 rollupData)
+```
+Get rollup data: VerifierType Pessimistic
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`rollupID` | uint32 | Rollup identifier
-|`batchNum` | uint64 | Batch number
## Events
### AddNewRollupType
@@ -782,14 +602,6 @@ Emitted when a rollup is udpated
Emitted when a new verifier is added
-### VerifyBatches
-```solidity
- event VerifyBatches(
- )
-```
-
-Emitted when an aggregator verifies batches
-
### VerifyBatchesTrustedAggregator
```solidity
event VerifyBatchesTrustedAggregator(
@@ -798,61 +610,13 @@ Emitted when an aggregator verifies batches
Emitted when the trusted aggregator verifies batches
-### ConsolidatePendingState
+### RollbackBatches
```solidity
- event ConsolidatePendingState(
+ event RollbackBatches(
)
```
-Emitted when pending state is consolidated
-
-### ProveNonDeterministicPendingState
-```solidity
- event ProveNonDeterministicPendingState(
- )
-```
-
-Emitted when is proved a different state given the same batches
-
-### OverridePendingState
-```solidity
- event OverridePendingState(
- )
-```
-
-Emitted when the trusted aggregator overrides pending state
-
-### SetTrustedAggregatorTimeout
-```solidity
- event SetTrustedAggregatorTimeout(
- )
-```
-
-Emitted when is updated the trusted aggregator timeout
-
-### SetPendingStateTimeout
-```solidity
- event SetPendingStateTimeout(
- )
-```
-
-Emitted when is updated the pending state timeout
-
-### SetMultiplierBatchFee
-```solidity
- event SetMultiplierBatchFee(
- )
-```
-
-Emitted when is updated the multiplier batch fee
-
-### SetVerifyBatchTimeTarget
-```solidity
- event SetVerifyBatchTimeTarget(
- )
-```
-
-Emitted when is updated the verify batch timeout
+Emitted when rollback batches
### SetTrustedAggregator
```solidity
@@ -870,3 +634,11 @@ Emitted when is updated the trusted aggregator address
Emitted when is updated the batch fee
+### UpdateRollupManagerVersion
+```solidity
+ event UpdateRollupManagerVersion(
+ )
+```
+
+Emitted when rollup manager is upgraded
+
diff --git a/docs/v2/PolygonZkEVMBridgeV2.md b/docs/v2/PolygonZkEVMBridgeV2.md
index c42e14a56..fa5c16754 100644
--- a/docs/v2/PolygonZkEVMBridgeV2.md
+++ b/docs/v2/PolygonZkEVMBridgeV2.md
@@ -62,7 +62,7 @@ note User/UI must be aware of the existing/available networks when choosing the
|`destinationNetwork` | uint32 | Network destination
|`destinationAddress` | address | Address destination
|`amount` | uint256 | Amount of tokens
-|`token` | address | Token address, 0 address is reserved for ether
+|`token` | address | Token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`forceUpdateGlobalExitRoot` | bool | Indicates if the new global exit root is updated or not
|`permitData` | bytes | Raw data of the call `permit` of the token
@@ -166,7 +166,7 @@ to avoid possible synch attacks
|`mainnetExitRoot` | bytes32 | Mainnet exit root
|`rollupExitRoot` | bytes32 | Rollup exit root
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`destinationNetwork` | uint32 | Network destination
|`destinationAddress` | address | Address destination
|`amount` | uint256 | Amount of tokens
@@ -235,7 +235,7 @@ wrapped address if the metadata provided is not the original one.
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`name` | string | Name of the token
|`symbol` | string | Symbol of the token
|`decimals` | uint8 | Decimals of the token
@@ -254,7 +254,7 @@ Returns the address of a wrapper using the token information if already exist
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
### activateEmergencyState
```solidity
@@ -310,6 +310,22 @@ Verify leaf and checks that it has not been claimed
Function to check if an index is claimed or not
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`leafIndex` | uint32 | Index
+|`sourceBridgeNetwork` | uint32 | Origin network
+
+### _setAndCheckClaimed
+```solidity
+ function _setAndCheckClaimed(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) internal
+```
+Function to check that an index is not claimed and set it as claimed
+
+
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
@@ -334,6 +350,56 @@ Function to update the globalExitRoot
+### _bridgeWrappedAsset
+```solidity
+ function _bridgeWrappedAsset(
+ contract TokenWrapped tokenWrapped,
+ uint256 amount
+ ) internal
+```
+Burn tokens from wrapped token to execute the bridge
+note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`tokenWrapped` | contract TokenWrapped | Wrapped token to burnt
+|`amount` | uint256 | Amount of tokens
+
+### _claimWrappedAsset
+```solidity
+ function _claimWrappedAsset(
+ contract TokenWrapped tokenWrapped,
+ address destinationAddress,
+ uint256 amount
+ ) internal
+```
+Mints tokens from wrapped token to proceed with the claim
+note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`tokenWrapped` | contract TokenWrapped | Wrapped token to mint
+|`destinationAddress` | address | Minted token receiver
+|`amount` | uint256 | Amount of tokens
+
+### _bitmapPositions
+```solidity
+ function _bitmapPositions(
+ uint256 index
+ ) internal returns (uint256 wordPos, uint256 bitPos)
+```
+Function decode an index into a wordPos and bitPos
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`index` | uint256 | Index
+
### _permit
```solidity
function _permit(
@@ -458,7 +524,7 @@ wrapped address if the metadata provided is not the original one.
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`token` | address | Address of the token to calculate the wrapper address
## Events
diff --git a/docs/v2/PolygonZkEVMGlobalExitRootV2.md b/docs/v2/PolygonZkEVMGlobalExitRootV2.md
index fa0378498..481824309 100644
--- a/docs/v2/PolygonZkEVMGlobalExitRootV2.md
+++ b/docs/v2/PolygonZkEVMGlobalExitRootV2.md
@@ -17,6 +17,15 @@ Contract responsible for managing the exit roots across multiple networks
|`_rollupManager` | address | Rollup manager contract address
|`_bridgeAddress` | address | PolygonZkEVMBridge contract address
+### initialize
+```solidity
+ function initialize(
+ ) external
+```
+Reset the deposit tree since will be replace by a recursive one
+
+
+
### updateExitRoot
```solidity
function updateExitRoot(
@@ -64,7 +73,7 @@ Given the leaf data returns the leaf hash
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`newGlobalExitRoot` | bytes32 | Last global exit root
-|`lastBlockHash` | uint256 | Last accesible block hash
+|`lastBlockHash` | uint256 | Last accessible block hash
|`timestamp` | uint64 | Ethereum timestamp in seconds
## Events
@@ -76,3 +85,19 @@ Given the leaf data returns the leaf hash
Emitted when the global exit root is updated
+### UpdateL1InfoTreeV2
+```solidity
+ event UpdateL1InfoTreeV2(
+ )
+```
+
+Emitted when the global exit root is updated with the L1InfoTree leaf information
+
+### InitL1InfoRootMap
+```solidity
+ event InitL1InfoRootMap(
+ )
+```
+
+Emitted when the global exit root manager starts adding leafs to the L1InfoRootMap
+
diff --git a/docs/v2/consensus/dataComittee/CDKDataCommittee.md b/docs/v2/consensus/dataComittee/CDKDataCommittee.md
deleted file mode 100644
index b43f7504d..000000000
--- a/docs/v2/consensus/dataComittee/CDKDataCommittee.md
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-## Functions
-### initialize
-```solidity
- function initialize(
- ) external
-```
-
-
-
-
-### setupCommittee
-```solidity
- function setupCommittee(
- uint256 _requiredAmountOfSignatures,
- string[] urls,
- bytes addrsBytes
- ) external
-```
-Allows the admin to setup the members of the committee. Note that:
-The system will require N / M signatures where N => _requiredAmountOfSignatures and M => urls.length
-There must be the same amount of urls than addressess encoded in the addrsBytes
-A member is represented by the url and the address contained in urls[i] and addrsBytes[i*_ADDR_SIZE : i*_ADDR_SIZE + _ADDR_SIZE]
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_requiredAmountOfSignatures` | uint256 | Required amount of signatures
-|`urls` | string[] | List of urls of the members of the committee
-|`addrsBytes` | bytes | Byte array that contains the addressess of the members of the committee
-
-### getAmountOfMembers
-```solidity
- function getAmountOfMembers(
- ) public returns (uint256)
-```
-
-
-
-
-### verifySignatures
-```solidity
- function verifySignatures(
- bytes32 signedHash,
- bytes signaturesAndAddrs
- ) external
-```
-Verifies that the given signedHash has been signed by requiredAmountOfSignatures committee members
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`signedHash` | bytes32 | Hash that must have been signed by requiredAmountOfSignatures of committee members
-|`signaturesAndAddrs` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order
-[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
-note that each ECDSA signatures are used, therefore each one must be 65 bytes
-
-## Events
-### CommitteeUpdated
-```solidity
- event CommitteeUpdated(
- bytes32 committeeHash
- )
-```
-
-Emitted when the committee is updated
-
-#### Parameters:
-| Name | Type | Description |
-| :----------------------------- | :------------ | :--------------------------------------------- |
-|`committeeHash`| bytes32 | hash of the addresses of the committee members
diff --git a/docs/v2/consensus/dataComittee/PolygonDataComittee.md b/docs/v2/consensus/dataComittee/PolygonDataComittee.md
deleted file mode 100644
index d5bba03dd..000000000
--- a/docs/v2/consensus/dataComittee/PolygonDataComittee.md
+++ /dev/null
@@ -1,76 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridge _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) public
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
-### sequenceBatches
-```solidity
- function sequenceBatches(
- ) public
-```
-
-
-
-
-### sequenceBatchesDataCommittee
-```solidity
- function sequenceBatchesDataCommittee(
- struct PolygonDataComittee.ValidiumBatchData[] batches,
- address l2Coinbase,
- bytes dataAvailabilityMessage
- ) external
-```
-Allows a sequencer to send multiple batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonDataComittee.ValidiumBatchData[] | Struct array which holds the necessary data to append new batches to the sequence
-|`l2Coinbase` | address | Address that will receive the fees from L2
-|`dataAvailabilityMessage` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order
-[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
-note that each ECDSA signatures are used, therefore each one must be 65 bytes
-
-### switchSequenceWithDataAvailability
-```solidity
- function switchSequenceWithDataAvailability(
- ) external
-```
-Allow the admin to turn on the force batches
-This action is not reversible
-
-
-
-## Events
-### SwitchSequenceWithDataAvailability
-```solidity
- event SwitchSequenceWithDataAvailability(
- )
-```
-
-Emitted when switch the ability to sequence with data availability
-
diff --git a/docs/v2/mocks/PolygonRollupManagerMockInternalTest.md b/docs/v2/consensus/pessimistic/PolygonPessimisticConsensus.md
similarity index 52%
rename from docs/v2/mocks/PolygonRollupManagerMockInternalTest.md
rename to docs/v2/consensus/pessimistic/PolygonPessimisticConsensus.md
index dd333a250..1a3b33bc9 100644
--- a/docs/v2/mocks/PolygonRollupManagerMockInternalTest.md
+++ b/docs/v2/consensus/pessimistic/PolygonPessimisticConsensus.md
@@ -1,4 +1,4 @@
-PolygonRollupManager Test
+
## Functions
@@ -7,7 +7,8 @@ PolygonRollupManager Test
function constructor(
contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridge _bridgeAddress
+ contract IPolygonZkEVMBridgeV2 _bridgeAddress,
+ contract PolygonRollupManager _rollupManager
) public
```
@@ -16,15 +17,16 @@ PolygonRollupManager Test
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | MATIC token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
+|`_pol` | contract IERC20Upgradeable | POL token address
+|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address
+|`_rollupManager` | contract PolygonRollupManager | Rollup manager address
-### initialize
+### getConsensusHash
```solidity
- function initialize(
- ) external
+ function getConsensusHash(
+ ) public returns (bytes32)
```
-
+Note Return the necessary consensus information for the proof hashed
diff --git a/docs/v2/consensus/validium/PolygonValidiumEtrog.md b/docs/v2/consensus/validium/PolygonValidiumEtrog.md
index 23333cdfc..863d7269c 100644
--- a/docs/v2/consensus/validium/PolygonValidiumEtrog.md
+++ b/docs/v2/consensus/validium/PolygonValidiumEtrog.md
@@ -31,8 +31,9 @@ It is advised to use timelocks for the admin address in case of Validium since i
```solidity
function sequenceBatchesValidium(
struct PolygonValidiumEtrog.ValidiumBatchData[] batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase,
bytes dataAvailabilityMessage
) external
@@ -44,9 +45,10 @@ Allows a sequencer to send multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonValidiumEtrog.ValidiumBatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`l1InfoTreeLeafCount` | uint32 | Count of the L1InfoTree leaf that will be used in this sequence
|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+|`expectedFinalAccInputHash` | bytes32 | This parameter must match the acc input hash after hash all the batch data
This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
|`dataAvailabilityMessage` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order
@@ -58,8 +60,9 @@ note Pol is not a reentrant token
```solidity
function sequenceBatches(
struct PolygonRollupBaseEtrog.BatchData[] batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase
) public
```
@@ -70,9 +73,10 @@ Allows a sequencer to send multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonRollupBaseEtrog.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`l1InfoTreeLeafCount` | uint32 | Count of the L1InfoTree leaf that will be used in this sequence
|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+|`expectedFinalAccInputHash` | bytes32 | This parameter must match the acc input hash after hash all the batch data
This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
note Pol is not a reentrant token
diff --git a/docs/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.md b/docs/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.md
deleted file mode 100644
index 9d1dcba8e..000000000
--- a/docs/v2/consensus/validium/migration/PolygonRollupBaseEtrogNoGap.md
+++ /dev/null
@@ -1,327 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridgeV2 _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) internal
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
-### initialize
-```solidity
- function initialize(
- address _admin,
- address sequencer,
- uint32 networkID,
- address _gasTokenAddress,
- string sequencerURL,
- string _networkName
- ) external
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_admin` | address | Admin address
-|`sequencer` | address | Trusted sequencer address
-|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge
-|`_gasTokenAddress` | address | Indicates the token address in mainnet that will be used as a gas token
-Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead
-|`sequencerURL` | string | Trusted sequencer URL
-|`_networkName` | string | L2 network name
-
-### sequenceBatches
-```solidity
- function sequenceBatches(
- struct PolygonRollupBaseEtrogNoGap.BatchData[] batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase
- ) public
-```
-Allows a sequencer to send multiple batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonRollupBaseEtrogNoGap.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
-|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
-This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
-This will be a protection for the sequencer to avoid sending undesired data
-|`l2Coinbase` | address | Address that will receive the fees from L2
-note Pol is not a reentrant token
-
-### onVerifyBatches
-```solidity
- function onVerifyBatches(
- uint64 lastVerifiedBatch,
- bytes32 newStateRoot,
- address aggregator
- ) public
-```
-Callback on verify batches, can only be called by the rollup manager
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`lastVerifiedBatch` | uint64 | Last verified batch
-|`newStateRoot` | bytes32 | new state root
-|`aggregator` | address | Aggregator address
-
-### forceBatch
-```solidity
- function forceBatch(
- bytes transactions,
- uint256 polAmount
- ) public
-```
-Allows a sequencer/user to force a batch of L2 transactions.
-This should be used only in extreme cases where the trusted sequencer does not work as expected
-Note The sequencer has certain degree of control on how non-forced and forced batches are ordered
-In order to assure that users force transactions will be processed properly, user must not sign any other transaction
-with the same nonce
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`transactions` | bytes | L2 ethereum transactions EIP-155 or pre-EIP-155 with signature:
-|`polAmount` | uint256 | Max amount of pol tokens that the sender is willing to pay
-
-### sequenceForceBatches
-```solidity
- function sequenceForceBatches(
- struct PolygonRollupBaseEtrogNoGap.BatchData[] batches
- ) external
-```
-Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonRollupBaseEtrogNoGap.BatchData[] | Struct array which holds the necessary data to append force batches
-
-### setTrustedSequencer
-```solidity
- function setTrustedSequencer(
- address newTrustedSequencer
- ) external
-```
-Allow the admin to set a new trusted sequencer
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencer` | address | Address of the new trusted sequencer
-
-### setTrustedSequencerURL
-```solidity
- function setTrustedSequencerURL(
- string newTrustedSequencerURL
- ) external
-```
-Allow the admin to set the trusted sequencer URL
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencerURL` | string | URL of trusted sequencer
-
-### setForceBatchAddress
-```solidity
- function setForceBatchAddress(
- address newForceBatchAddress
- ) external
-```
-Allow the admin to change the force batch address, that will be allowed to force batches
-If address 0 is set, then everyone is able to force batches, this action is irreversible
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newForceBatchAddress` | address | New force batch address
-
-### setForceBatchTimeout
-```solidity
- function setForceBatchTimeout(
- uint64 newforceBatchTimeout
- ) external
-```
-Allow the admin to set the forcedBatchTimeout
-The new value can only be lower, except if emergency state is active
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newforceBatchTimeout` | uint64 | New force batch timeout
-
-### transferAdminRole
-```solidity
- function transferAdminRole(
- address newPendingAdmin
- ) external
-```
-Starts the admin role transfer
-This is a two step process, the pending admin must accepted to finalize the process
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newPendingAdmin` | address | Address of the new pending admin
-
-### acceptAdminRole
-```solidity
- function acceptAdminRole(
- ) external
-```
-Allow the current pending admin to accept the admin role
-
-
-
-### calculatePolPerForceBatch
-```solidity
- function calculatePolPerForceBatch(
- ) public returns (uint256)
-```
-Function to calculate the reward for a forced batch
-
-
-
-### generateInitializeTransaction
-```solidity
- function generateInitializeTransaction(
- uint32 networkID,
- address _gasTokenAddress,
- uint32 _gasTokenNetwork,
- bytes _gasTokenMetadata
- ) public returns (bytes)
-```
-Generate Initialize transaction for hte bridge on L2
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge
-|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
-|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address
-|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata
-
-## Events
-### SequenceBatches
-```solidity
- event SequenceBatches(
- )
-```
-
-Emitted when the trusted sequencer sends a new batch of transactions
-
-### ForceBatch
-```solidity
- event ForceBatch(
- )
-```
-
-Emitted when a batch is forced
-
-### SequenceForceBatches
-```solidity
- event SequenceForceBatches(
- )
-```
-
-Emitted when forced batches are sequenced by not the trusted sequencer
-
-### InitialSequenceBatches
-```solidity
- event InitialSequenceBatches(
- )
-```
-
-Emitted when the contract is initialized, contain the first sequenced transaction
-
-### VerifyBatches
-```solidity
- event VerifyBatches(
- )
-```
-
-Emitted when a aggregator verifies batches
-
-### SetTrustedSequencer
-```solidity
- event SetTrustedSequencer(
- )
-```
-
-Emitted when the admin updates the trusted sequencer address
-
-### SetTrustedSequencerURL
-```solidity
- event SetTrustedSequencerURL(
- )
-```
-
-Emitted when the admin updates the sequencer URL
-
-### SetForceBatchTimeout
-```solidity
- event SetForceBatchTimeout(
- )
-```
-
-Emitted when the admin update the force batch timeout
-
-### SetForceBatchAddress
-```solidity
- event SetForceBatchAddress(
- )
-```
-
-Emitted when the admin update the force batch address
-
-### TransferAdminRole
-```solidity
- event TransferAdminRole(
- )
-```
-
-Emitted when the admin starts the two-step transfer role setting a new pending admin
-
-### AcceptAdminRole
-```solidity
- event AcceptAdminRole(
- )
-```
-
-Emitted when the pending admin accepts the admin role
-
diff --git a/docs/v2/consensus/validium/migration/PolygonValidiumStorageMigration.md b/docs/v2/consensus/validium/migration/PolygonValidiumStorageMigration.md
deleted file mode 100644
index 7a45c586d..000000000
--- a/docs/v2/consensus/validium/migration/PolygonValidiumStorageMigration.md
+++ /dev/null
@@ -1,133 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-It is advised to use timelocks for the admin address in case of Validium since if can change the dataAvailabilityProtocol
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridgeV2 _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) public
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
-### initializeMigration
-```solidity
- function initializeMigration(
- ) external
-```
-
-
-
-
-### sequenceBatchesValidium
-```solidity
- function sequenceBatchesValidium(
- struct PolygonValidiumStorageMigration.ValidiumBatchData[] batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase,
- bytes dataAvailabilityMessage
- ) external
-```
-Allows a sequencer to send multiple batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonValidiumStorageMigration.ValidiumBatchData[] | Struct array which holds the necessary data to append new batches to the sequence
-|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
-This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
-This will be a protection for the sequencer to avoid sending undesired data
-|`l2Coinbase` | address | Address that will receive the fees from L2
-|`dataAvailabilityMessage` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order
-[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
-note that each ECDSA signatures are used, therefore each one must be 65 bytes
-note Pol is not a reentrant token
-
-### sequenceBatches
-```solidity
- function sequenceBatches(
- struct PolygonRollupBaseEtrogNoGap.BatchData[] batches,
- uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
- address l2Coinbase
- ) public
-```
-Allows a sequencer to send multiple batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonRollupBaseEtrogNoGap.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
-|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
-This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
-This will be a protection for the sequencer to avoid sending undesired data
-|`l2Coinbase` | address | Address that will receive the fees from L2
-note Pol is not a reentrant token
-
-### setDataAvailabilityProtocol
-```solidity
- function setDataAvailabilityProtocol(
- contract IDataAvailabilityProtocol newDataAvailabilityProtocol
- ) external
-```
-Allow the admin to set a new data availability protocol
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newDataAvailabilityProtocol` | contract IDataAvailabilityProtocol | Address of the new data availability protocol
-
-### switchSequenceWithDataAvailability
-```solidity
- function switchSequenceWithDataAvailability(
- bool newIsSequenceWithDataAvailabilityAllowed
- ) external
-```
-Allow the admin to switch the sequence with data availability
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newIsSequenceWithDataAvailabilityAllowed` | bool | Boolean to switch
-
-## Events
-### SetDataAvailabilityProtocol
-```solidity
- event SetDataAvailabilityProtocol(
- )
-```
-
-Emitted when the admin updates the data availability protocol
-
-### SwitchSequenceWithDataAvailability
-```solidity
- event SwitchSequenceWithDataAvailability(
- )
-```
-
-Emitted when switch the ability to sequence with data availability
-
diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md b/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md
deleted file mode 100644
index 05626cf12..000000000
--- a/docs/v2/consensus/zkEVM/PolygonZkEVMV2.md
+++ /dev/null
@@ -1,28 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridge _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) public
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
diff --git a/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md b/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md
deleted file mode 100644
index eb04f3948..000000000
--- a/docs/v2/consensus/zkEVM/PolygonZkEVMV2Existent.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridge _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) public
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
-### initializeUpgrade
-```solidity
- function initializeUpgrade(
- address _admin,
- address _trustedSequencer,
- string _trustedSequencerURL,
- string _networkName,
- bytes32 _lastAccInputHash,
- uint64 _lastTimestamp
- ) external
-```
-note This initializer will be called instead of the PolygonRollupBase
-This is a especial initializer since the zkEVM it's an already created network
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_admin` | address | Admin address
-|`_trustedSequencer` | address | Trusted sequencer address
-|`_trustedSequencerURL` | string | Trusted sequencer URL
-|`_networkName` | string | L2 network name
-|`_lastAccInputHash` | bytes32 | Acc input hash
-|`_lastTimestamp` | uint64 | Timestamp
-
diff --git a/docs/v2/interfaces/IBridgeL2SovereignChains.md b/docs/v2/interfaces/IBridgeL2SovereignChains.md
new file mode 100644
index 000000000..884a286e2
--- /dev/null
+++ b/docs/v2/interfaces/IBridgeL2SovereignChains.md
@@ -0,0 +1,13 @@
+
+
+
+## Functions
+### initialize
+```solidity
+ function initialize(
+ ) external
+```
+
+
+
+
diff --git a/docs/v2/interfaces/ICDKDataCommittee.md b/docs/v2/interfaces/ICDKDataCommittee.md
deleted file mode 100644
index 13b0d302b..000000000
--- a/docs/v2/interfaces/ICDKDataCommittee.md
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-## Functions
-### verifySignatures
-```solidity
- function verifySignatures(
- ) external
-```
-
-
-
-
diff --git a/docs/v2/interfaces/IPolygonConsensusBase.md b/docs/v2/interfaces/IPolygonConsensusBase.md
new file mode 100644
index 000000000..a20ee8247
--- /dev/null
+++ b/docs/v2/interfaces/IPolygonConsensusBase.md
@@ -0,0 +1,22 @@
+
+
+
+## Functions
+### initialize
+```solidity
+ function initialize(
+ ) external
+```
+
+
+
+
+### admin
+```solidity
+ function admin(
+ ) external returns (address)
+```
+
+
+
+
diff --git a/docs/v2/interfaces/IPolygonPessimisticConsensus.md b/docs/v2/interfaces/IPolygonPessimisticConsensus.md
new file mode 100644
index 000000000..8f208b00a
--- /dev/null
+++ b/docs/v2/interfaces/IPolygonPessimisticConsensus.md
@@ -0,0 +1,13 @@
+
+
+
+## Functions
+### getConsensusHash
+```solidity
+ function getConsensusHash(
+ ) external returns (bytes32)
+```
+
+
+
+
diff --git a/docs/v2/interfaces/IPolygonRollupBase.md b/docs/v2/interfaces/IPolygonRollupBase.md
index ca8d758f2..07ef4640d 100644
--- a/docs/v2/interfaces/IPolygonRollupBase.md
+++ b/docs/v2/interfaces/IPolygonRollupBase.md
@@ -2,18 +2,18 @@
## Functions
-### initialize
+### onVerifyBatches
```solidity
- function initialize(
+ function onVerifyBatches(
) external
```
-### onVerifyBatches
+### rollbackBatches
```solidity
- function onVerifyBatches(
+ function rollbackBatches(
) external
```
diff --git a/docs/v2/interfaces/IPolygonRollupManager.md b/docs/v2/interfaces/IPolygonRollupManager.md
index b28b04f64..6f3d63fc8 100644
--- a/docs/v2/interfaces/IPolygonRollupManager.md
+++ b/docs/v2/interfaces/IPolygonRollupManager.md
@@ -1,3 +1,202 @@
+## Functions
+### addNewRollupType
+```solidity
+ function addNewRollupType(
+ ) external
+```
+
+
+
+
+### obsoleteRollupType
+```solidity
+ function obsoleteRollupType(
+ ) external
+```
+
+
+
+
+### createNewRollup
+```solidity
+ function createNewRollup(
+ ) external
+```
+
+
+
+
+### addExistingRollup
+```solidity
+ function addExistingRollup(
+ ) external
+```
+
+
+
+
+### updateRollupByRollupAdmin
+```solidity
+ function updateRollupByRollupAdmin(
+ ) external
+```
+
+
+
+
+### updateRollup
+```solidity
+ function updateRollup(
+ ) external
+```
+
+
+
+
+### rollbackBatches
+```solidity
+ function rollbackBatches(
+ ) external
+```
+
+
+
+
+### onSequenceBatches
+```solidity
+ function onSequenceBatches(
+ ) external returns (uint64)
+```
+
+
+
+
+### verifyBatchesTrustedAggregator
+```solidity
+ function verifyBatchesTrustedAggregator(
+ ) external
+```
+
+
+
+
+### verifyPessimisticTrustedAggregator
+```solidity
+ function verifyPessimisticTrustedAggregator(
+ ) external
+```
+
+
+
+
+### activateEmergencyState
+```solidity
+ function activateEmergencyState(
+ ) external
+```
+
+
+
+
+### deactivateEmergencyState
+```solidity
+ function deactivateEmergencyState(
+ ) external
+```
+
+
+
+
+### setBatchFee
+```solidity
+ function setBatchFee(
+ ) external
+```
+
+
+
+
+### getRollupExitRoot
+```solidity
+ function getRollupExitRoot(
+ ) external returns (bytes32)
+```
+
+
+
+
+### getLastVerifiedBatch
+```solidity
+ function getLastVerifiedBatch(
+ ) external returns (uint64)
+```
+
+
+
+
+### calculateRewardPerBatch
+```solidity
+ function calculateRewardPerBatch(
+ ) external returns (uint256)
+```
+
+
+
+
+### getBatchFee
+```solidity
+ function getBatchFee(
+ ) external returns (uint256)
+```
+
+
+
+
+### getForcedBatchFee
+```solidity
+ function getForcedBatchFee(
+ ) external returns (uint256)
+```
+
+
+
+
+### getInputPessimisticBytes
+```solidity
+ function getInputPessimisticBytes(
+ ) external returns (bytes)
+```
+
+
+
+
+### getInputSnarkBytes
+```solidity
+ function getInputSnarkBytes(
+ ) external returns (bytes)
+```
+
+
+
+
+### getRollupBatchNumToStateRoot
+```solidity
+ function getRollupBatchNumToStateRoot(
+ ) external returns (bytes32)
+```
+
+
+
+
+### lastDeactivatedEmergencyStateTimestamp
+```solidity
+ function lastDeactivatedEmergencyStateTimestamp(
+ ) external returns (uint64)
+```
+
+
+
+
diff --git a/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md b/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md
deleted file mode 100644
index 64dcd6b89..000000000
--- a/docs/v2/interfaces/IPolygonZkEVMBaseBridge.md
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-## Functions
-### bridgeAsset
-```solidity
- function bridgeAsset(
- ) external
-```
-
-
-
-
-### bridgeMessage
-```solidity
- function bridgeMessage(
- ) external
-```
-
-
-
-
-### claimAsset
-```solidity
- function claimAsset(
- ) external
-```
-
-
-
-
-### claimMessage
-```solidity
- function claimMessage(
- ) external
-```
-
-
-
-
-### updateGlobalExitRoot
-```solidity
- function updateGlobalExitRoot(
- ) external
-```
-
-
-
-
diff --git a/docs/v2/interfaces/ICDKDataCommitteeErrors.md b/docs/v2/interfaces/IPolygonZkEVMEtrogErrors.md
similarity index 100%
rename from docs/v2/interfaces/ICDKDataCommitteeErrors.md
rename to docs/v2/interfaces/IPolygonZkEVMEtrogErrors.md
diff --git a/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md b/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md
index 492ce7346..ffae50460 100644
--- a/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md
+++ b/docs/v2/interfaces/IPolygonZkEVMGlobalExitRootV2.md
@@ -20,3 +20,12 @@
+### l1InfoRootMap
+```solidity
+ function l1InfoRootMap(
+ ) external returns (bytes32)
+```
+
+
+
+
diff --git a/docs/v2/interfaces/IPolygonZkEVMV2Errors.md b/docs/v2/interfaces/IPolygonZkEVMV2Errors.md
deleted file mode 100644
index b28b04f64..000000000
--- a/docs/v2/interfaces/IPolygonZkEVMV2Errors.md
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md b/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md
deleted file mode 100644
index b28b04f64..000000000
--- a/docs/v2/interfaces/IPolygonZkEVMVEtrogErrors.md
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/docs/v2/interfaces/ISP1Verifier.md b/docs/v2/interfaces/ISP1Verifier.md
new file mode 100644
index 000000000..b1ce147d4
--- /dev/null
+++ b/docs/v2/interfaces/ISP1Verifier.md
@@ -0,0 +1,24 @@
+This contract is the interface for the SP1 Verifier.
+
+
+## Functions
+### verifyProof
+```solidity
+ function verifyProof(
+ bytes32 programVKey,
+ bytes publicValues,
+ bytes proofBytes
+ ) external
+```
+Verifies a proof with given public values and vkey.
+
+It is expected that the first 4 bytes of proofBytes must match the first 4 bytes of
+target verifier's VERIFIER_HASH.
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`programVKey` | bytes32 | The verification key for the RISC-V program.
+|`publicValues` | bytes | The public values encoded as bytes.
+|`proofBytes` | bytes | The proof of the program execution the SP1 zkVM encoded as bytes.
+
diff --git a/docs/v2/interfaces/ISP1VerifierWithHash.md b/docs/v2/interfaces/ISP1VerifierWithHash.md
new file mode 100644
index 000000000..cfc841639
--- /dev/null
+++ b/docs/v2/interfaces/ISP1VerifierWithHash.md
@@ -0,0 +1,13 @@
+
+
+
+## Functions
+### VERIFIER_HASH
+```solidity
+ function VERIFIER_HASH(
+ ) external returns (bytes32)
+```
+Returns the hash of the verifier.
+
+
+
diff --git a/docs/v2/lib/DepositContractLib.md b/docs/v2/lib/DepositContractLib.md
deleted file mode 100644
index 36b40f1e9..000000000
--- a/docs/v2/lib/DepositContractLib.md
+++ /dev/null
@@ -1,48 +0,0 @@
-This contract will be used as a helper for all the sparse merkle tree related functions
-Based on the implementation of the deposit eth2.0 contract https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol
-
-
-## Functions
-### getRoot
-```solidity
- function getRoot(
- ) public returns (bytes32)
-```
-Computes and returns the merkle root
-
-
-
-### _addLeaf
-```solidity
- function _addLeaf(
- bytes32 leaf
- ) internal
-```
-Add a new leaf to the merkle tree
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`leaf` | bytes32 | Leaf
-
-### verifyMerkleProof
-```solidity
- function verifyMerkleProof(
- bytes32 leaf,
- bytes32[32] smtProof,
- uint32 index,
- bytes32 root
- ) public returns (bool)
-```
-Verify merkle proof
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`leaf` | bytes32 | Leaf
-|`smtProof` | bytes32[32] | Smt proof
-|`index` | uint32 | Index of the leaf
-|`root` | bytes32 | Merkle root
-
diff --git a/docs/v2/lib/DepositContractV2.md b/docs/v2/lib/DepositContractV2.md
index 1357d1199..b1df37529 100644
--- a/docs/v2/lib/DepositContractV2.md
+++ b/docs/v2/lib/DepositContractV2.md
@@ -23,7 +23,7 @@ Given the leaf data returns the leaf value
| :--- | :--- | :------------------------------------------------------------------- |
|`leafType` | uint8 | Leaf type --> [0] transfer Ether / ERC20 tokens, [1] message
|`originNetwork` | uint32 | Origin Network
-|`originAddress` | address | [0] Origin token address, 0 address is reserved for ether, [1] msg.sender of the message
+|`originAddress` | address | [0] Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token, [1] msg.sender of the message
|`destinationNetwork` | uint32 | Destination network
|`destinationAddress` | address | Destination address
|`amount` | uint256 | [0] Amount of tokens/ether, [1] Amount of ether
diff --git a/docs/v2/lib/PolygonConsensusBase.md b/docs/v2/lib/PolygonConsensusBase.md
new file mode 100644
index 000000000..e81bec15d
--- /dev/null
+++ b/docs/v2/lib/PolygonConsensusBase.md
@@ -0,0 +1,135 @@
+Contract responsible for managing the states and the updates of L2 network.
+There will be a trusted sequencer, which is able to send transactions.
+Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
+The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
+The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
+To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ contract IERC20Upgradeable _pol,
+ contract IPolygonZkEVMBridgeV2 _bridgeAddress,
+ contract PolygonRollupManager _rollupManager
+ ) internal
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
+|`_pol` | contract IERC20Upgradeable | POL token address
+|`_bridgeAddress` | contract IPolygonZkEVMBridgeV2 | Bridge address
+|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
+
+### initialize
+```solidity
+ function initialize(
+ address _admin,
+ address sequencer,
+ uint32 _gasTokenAddress,
+ address sequencerURL,
+ string _networkName
+ ) external
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_admin` | address | Admin address
+|`sequencer` | address | Trusted sequencer address
+|`_gasTokenAddress` | uint32 | Indicates the token address in mainnet that will be used as a gas token
+Note if a wrapped token of the bridge is used, the original network and address of this wrapped are used instead
+|`sequencerURL` | address | Trusted sequencer URL
+|`_networkName` | string | L2 network name
+
+### setTrustedSequencer
+```solidity
+ function setTrustedSequencer(
+ address newTrustedSequencer
+ ) external
+```
+Allow the admin to set a new trusted sequencer
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newTrustedSequencer` | address | Address of the new trusted sequencer
+
+### setTrustedSequencerURL
+```solidity
+ function setTrustedSequencerURL(
+ string newTrustedSequencerURL
+ ) external
+```
+Allow the admin to set the trusted sequencer URL
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newTrustedSequencerURL` | string | URL of trusted sequencer
+
+### transferAdminRole
+```solidity
+ function transferAdminRole(
+ address newPendingAdmin
+ ) external
+```
+Starts the admin role transfer
+This is a two step process, the pending admin must accepted to finalize the process
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newPendingAdmin` | address | Address of the new pending admin
+
+### acceptAdminRole
+```solidity
+ function acceptAdminRole(
+ ) external
+```
+Allow the current pending admin to accept the admin role
+
+
+
+## Events
+### SetTrustedSequencer
+```solidity
+ event SetTrustedSequencer(
+ )
+```
+
+Emitted when the admin updates the trusted sequencer address
+
+### SetTrustedSequencerURL
+```solidity
+ event SetTrustedSequencerURL(
+ )
+```
+
+Emitted when the admin updates the sequencer URL
+
+### TransferAdminRole
+```solidity
+ event TransferAdminRole(
+ )
+```
+
+Emitted when the admin starts the two-step transfer role setting a new pending admin
+
+### AcceptAdminRole
+```solidity
+ event AcceptAdminRole(
+ )
+```
+
+Emitted when the pending admin accepts the admin role
+
diff --git a/docs/v2/lib/PolygonRollupBase.md b/docs/v2/lib/PolygonRollupBase.md
deleted file mode 100644
index 49cb6dd34..000000000
--- a/docs/v2/lib/PolygonRollupBase.md
+++ /dev/null
@@ -1,306 +0,0 @@
-Contract responsible for managing the states and the updates of L2 network.
-There will be a trusted sequencer, which is able to send transactions.
-Any user can force some transaction and the sequencer will have a timeout to add them in the queue.
-The sequenced state is deterministic and can be precalculated before it's actually verified by a zkProof.
-The aggregators will be able to verify the sequenced state with zkProofs and therefore make available the withdrawals from L2 network.
-To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart contract that will be deployed in both networks.
-
-
-## Functions
-### constructor
-```solidity
- function constructor(
- contract IPolygonZkEVMGlobalExitRoot _globalExitRootManager,
- contract IERC20Upgradeable _pol,
- contract IPolygonZkEVMBridge _bridgeAddress,
- contract PolygonRollupManager _rollupManager
- ) public
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRoot | Global exit root manager address
-|`_pol` | contract IERC20Upgradeable | POL token address
-|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
-|`_rollupManager` | contract PolygonRollupManager | Global exit root manager address
-
-### initialize
-```solidity
- function initialize(
- address _admin,
- address sequencer,
- uint32 networkID,
- address _gasTokenAddress,
- uint32 _gasTokenNetwork,
- string sequencerURL,
- string _networkName
- ) external
-```
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`_admin` | address | Admin address
-|`sequencer` | address | Trusted sequencer address
-|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge
-|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
-|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address
-|`sequencerURL` | string | Trusted sequencer URL
-|`_networkName` | string | L2 network name
-
-### sequenceBatches
-```solidity
- function sequenceBatches(
- struct PolygonRollupBase.BatchData[] batches,
- address l2Coinbase
- ) public
-```
-Allows a sequencer to send multiple batches
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonRollupBase.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
-|`l2Coinbase` | address | Address that will receive the fees from L2
-
-### onVerifyBatches
-```solidity
- function onVerifyBatches(
- uint64 lastVerifiedBatch,
- bytes32 newStateRoot,
- address aggregator
- ) public
-```
-Callback on verify batches, can only be called by the rollup manager
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`lastVerifiedBatch` | uint64 | Last verified batch
-|`newStateRoot` | bytes32 | new state root
-|`aggregator` | address | Aggregator address
-
-### forceBatch
-```solidity
- function forceBatch(
- bytes transactions,
- uint256 polAmount
- ) public
-```
-Allows a sequencer/user to force a batch of L2 transactions.
-This should be used only in extreme cases where the trusted sequencer does not work as expected
-Note The sequencer has certain degree of control on how non-forced and forced batches are ordered
-In order to assure that users force transactions will be processed properly, user must not sign any other transaction
-with the same nonce
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`transactions` | bytes | L2 ethereum transactions EIP-155 or pre-EIP-155 with signature:
-|`polAmount` | uint256 | Max amount of pol tokens that the sender is willing to pay
-
-### sequenceForceBatches
-```solidity
- function sequenceForceBatches(
- struct PolygonRollupBase.ForcedBatchData[] batches
- ) external
-```
-Allows anyone to sequence forced Batches if the trusted sequencer has not done so in the timeout period
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`batches` | struct PolygonRollupBase.ForcedBatchData[] | Struct array which holds the necessary data to append force batches
-
-### setTrustedSequencer
-```solidity
- function setTrustedSequencer(
- address newTrustedSequencer
- ) external
-```
-Allow the admin to set a new trusted sequencer
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencer` | address | Address of the new trusted sequencer
-
-### setTrustedSequencerURL
-```solidity
- function setTrustedSequencerURL(
- string newTrustedSequencerURL
- ) external
-```
-Allow the admin to set the trusted sequencer URL
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencerURL` | string | URL of trusted sequencer
-
-### setForceBatchTimeout
-```solidity
- function setForceBatchTimeout(
- uint64 newforceBatchTimeout
- ) external
-```
-Allow the admin to set the forcedBatchTimeout
-The new value can only be lower, except if emergency state is active
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newforceBatchTimeout` | uint64 | New force batch timeout
-
-### activateForceBatches
-```solidity
- function activateForceBatches(
- ) external
-```
-Allow the admin to turn on the force batches
-This action is not reversible
-
-
-
-### transferAdminRole
-```solidity
- function transferAdminRole(
- address newPendingAdmin
- ) external
-```
-Starts the admin role transfer
-This is a two step process, the pending admin must accepted to finalize the process
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newPendingAdmin` | address | Address of the new pending admin
-
-### acceptAdminRole
-```solidity
- function acceptAdminRole(
- ) external
-```
-Allow the current pending admin to accept the admin role
-
-
-
-### calculatePolPerForceBatch
-```solidity
- function calculatePolPerForceBatch(
- ) public returns (uint256)
-```
-Function to calculate the reward for a forced batch
-
-
-
-### generateInitializeTransaction
-```solidity
- function generateInitializeTransaction(
- uint32 networkID,
- address _gasTokenAddress,
- uint32 _gasTokenNetwork
- ) public returns (bytes)
-```
-Generate Initialize transaction for hte bridge on L2
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge
-|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
-|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address
-
-## Events
-### SequenceBatches
-```solidity
- event SequenceBatches(
- )
-```
-
-Emitted when the trusted sequencer sends a new batch of transactions
-
-### ForceBatch
-```solidity
- event ForceBatch(
- )
-```
-
-Emitted when a batch is forced
-
-### SequenceForceBatches
-```solidity
- event SequenceForceBatches(
- )
-```
-
-Emitted when forced batches are sequenced by not the trusted sequencer
-
-### VerifyBatches
-```solidity
- event VerifyBatches(
- )
-```
-
-Emitted when a aggregator verifies batches
-
-### SetTrustedSequencer
-```solidity
- event SetTrustedSequencer(
- )
-```
-
-Emitted when the admin updates the trusted sequencer address
-
-### SetTrustedSequencerURL
-```solidity
- event SetTrustedSequencerURL(
- )
-```
-
-Emitted when the admin updates the sequencer URL
-
-### SetForceBatchTimeout
-```solidity
- event SetForceBatchTimeout(
- )
-```
-
-Emitted when the admin update the force batch timeout
-
-### ActivateForceBatches
-```solidity
- event ActivateForceBatches(
- )
-```
-
-Emitted when activate force batches
-
-### TransferAdminRole
-```solidity
- event TransferAdminRole(
- )
-```
-
-Emitted when the admin starts the two-step transfer role setting a new pending admin
-
-### AcceptAdminRole
-```solidity
- event AcceptAdminRole(
- )
-```
-
-Emitted when the pending admin accepts the admin role
-
diff --git a/docs/v2/lib/PolygonRollupBaseEtrog.md b/docs/v2/lib/PolygonRollupBaseEtrog.md
index a2184b926..d244e936c 100644
--- a/docs/v2/lib/PolygonRollupBaseEtrog.md
+++ b/docs/v2/lib/PolygonRollupBaseEtrog.md
@@ -54,8 +54,9 @@ Note if a wrapped token of the bridge is used, the original network and address
```solidity
function sequenceBatches(
struct PolygonRollupBaseEtrog.BatchData[] batches,
+ uint32 l1InfoTreeLeafCount,
uint64 maxSequenceTimestamp,
- uint64 initSequencedBatch,
+ bytes32 expectedFinalAccInputHash,
address l2Coinbase
) public
```
@@ -66,9 +67,10 @@ Allows a sequencer to send multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonRollupBaseEtrog.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`l1InfoTreeLeafCount` | uint32 | Count of the L1InfoTree leaf that will be used in this sequence
|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
-|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+|`expectedFinalAccInputHash` | bytes32 | This parameter must match the acc input hash after hash all the batch data
This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
note Pol is not a reentrant token
@@ -91,6 +93,22 @@ Callback on verify batches, can only be called by the rollup manager
|`newStateRoot` | bytes32 | new state root
|`aggregator` | address | Aggregator address
+### rollbackBatches
+```solidity
+ function rollbackBatches(
+ uint64 targetBatch,
+ bytes32 accInputHashToRollback
+ ) public
+```
+Callback on rollback batches, can only be called by the rollup manager
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`targetBatch` | uint64 | Batch to rollback up to but not including this batch
+|`accInputHashToRollback` | bytes32 | Acc input hash to rollback
+
### forceBatch
```solidity
function forceBatch(
@@ -125,34 +143,6 @@ Allows anyone to sequence forced Batches if the trusted sequencer has not done s
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonRollupBaseEtrog.BatchData[] | Struct array which holds the necessary data to append force batches
-### setTrustedSequencer
-```solidity
- function setTrustedSequencer(
- address newTrustedSequencer
- ) external
-```
-Allow the admin to set a new trusted sequencer
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencer` | address | Address of the new trusted sequencer
-
-### setTrustedSequencerURL
-```solidity
- function setTrustedSequencerURL(
- string newTrustedSequencerURL
- ) external
-```
-Allow the admin to set the trusted sequencer URL
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newTrustedSequencerURL` | string | URL of trusted sequencer
-
### setForceBatchAddress
```solidity
function setForceBatchAddress(
@@ -183,30 +173,6 @@ The new value can only be lower, except if emergency state is active
| :--- | :--- | :------------------------------------------------------------------- |
|`newforceBatchTimeout` | uint64 | New force batch timeout
-### transferAdminRole
-```solidity
- function transferAdminRole(
- address newPendingAdmin
- ) external
-```
-Starts the admin role transfer
-This is a two step process, the pending admin must accepted to finalize the process
-
-
-#### Parameters:
-| Name | Type | Description |
-| :--- | :--- | :------------------------------------------------------------------- |
-|`newPendingAdmin` | address | Address of the new pending admin
-
-### acceptAdminRole
-```solidity
- function acceptAdminRole(
- ) external
-```
-Allow the current pending admin to accept the admin role
-
-
-
### calculatePolPerForceBatch
```solidity
function calculatePolPerForceBatch(
@@ -286,21 +252,13 @@ Emitted when the contract is initialized, contain the first sequenced transactio
Emitted when a aggregator verifies batches
-### SetTrustedSequencer
+### RollbackBatches
```solidity
- event SetTrustedSequencer(
+ event RollbackBatches(
)
```
-Emitted when the admin updates the trusted sequencer address
-
-### SetTrustedSequencerURL
-```solidity
- event SetTrustedSequencerURL(
- )
-```
-
-Emitted when the admin updates the sequencer URL
+Emitted when a aggregator verifies batches
### SetForceBatchTimeout
```solidity
@@ -318,19 +276,3 @@ Emitted when the admin update the force batch timeout
Emitted when the admin update the force batch address
-### TransferAdminRole
-```solidity
- event TransferAdminRole(
- )
-```
-
-Emitted when the admin starts the two-step transfer role setting a new pending admin
-
-### AcceptAdminRole
-```solidity
- event AcceptAdminRole(
- )
-```
-
-Emitted when the pending admin accepts the admin role
-
diff --git a/docs/v2/mocks/BridgeReceiverMock.md b/docs/v2/mocks/BridgeReceiverMock.md
index e10a14c29..e92489d81 100644
--- a/docs/v2/mocks/BridgeReceiverMock.md
+++ b/docs/v2/mocks/BridgeReceiverMock.md
@@ -36,7 +36,7 @@ to avoid possible synch attacks
|`mainnetExitRoot` | bytes32 | Mainnet exit root
|`rollupExitRoot` | bytes32 | Rollup exit root
|`originNetwork` | uint32 | Origin network
-|`originTokenAddress` | address | Origin token address, 0 address is reserved for ether
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
|`destinationNetwork` | uint32 | Network destination
|`destinationAddress` | address | Address destination
|`amount` | uint256 | Amount of tokens
diff --git a/docs/v2/mocks/PolygonRollupManagerMock.md b/docs/v2/mocks/PolygonRollupManagerMock.md
index 4ef467459..98c0a8b34 100644
--- a/docs/v2/mocks/PolygonRollupManagerMock.md
+++ b/docs/v2/mocks/PolygonRollupManagerMock.md
@@ -37,3 +37,21 @@ PolygonRollupManager mock
+### exposed_checkStateRootInsidePrime
+```solidity
+ function exposed_checkStateRootInsidePrime(
+ ) public returns (bool)
+```
+
+
+
+
+### setRollupData
+```solidity
+ function setRollupData(
+ ) external
+```
+
+
+
+
diff --git a/docs/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.md b/docs/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.md
new file mode 100644
index 000000000..3409eafa9
--- /dev/null
+++ b/docs/v2/mocks/PolygonZkEVMGlobalExitRootV2Mock.md
@@ -0,0 +1,28 @@
+PolygonRollupManager mock
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ address _rollupManager,
+ address _bridgeAddress
+ ) public
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_rollupManager` | address | Rollup manager contract address
+|`_bridgeAddress` | address | PolygonZkEVMBridge contract address
+
+### injectGER
+```solidity
+ function injectGER(
+ ) external
+```
+
+
+
+
diff --git a/docs/v2/periphery/BatchL2DataCreatedRollup.md b/docs/v2/periphery/BatchL2DataCreatedRollup.md
new file mode 100644
index 000000000..bc46857dc
--- /dev/null
+++ b/docs/v2/periphery/BatchL2DataCreatedRollup.md
@@ -0,0 +1,26 @@
+
+
+
+## Functions
+### generateInitializeTransaction
+```solidity
+ function generateInitializeTransaction(
+ uint32 networkID,
+ address bridgeAddress,
+ address _gasTokenAddress,
+ uint32 _gasTokenNetwork,
+ bytes _gasTokenMetadata
+ ) public returns (bytes)
+```
+Generate Initialize transaction for hte bridge on L2
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`networkID` | uint32 | Indicates the network identifier that will be used in the bridge
+|`bridgeAddress` | address | Indicates the bridge address
+|`_gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
+|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address
+|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata
+
diff --git a/docs/v2/previousVersions/IPolygonRollupBasePrevious.md b/docs/v2/previousVersions/IPolygonRollupBasePrevious.md
new file mode 100644
index 000000000..8e8630121
--- /dev/null
+++ b/docs/v2/previousVersions/IPolygonRollupBasePrevious.md
@@ -0,0 +1,31 @@
+
+
+
+## Functions
+### initialize
+```solidity
+ function initialize(
+ ) external
+```
+
+
+
+
+### onVerifyBatches
+```solidity
+ function onVerifyBatches(
+ ) external
+```
+
+
+
+
+### admin
+```solidity
+ function admin(
+ ) external returns (address)
+```
+
+
+
+
diff --git a/docs/v2/interfaces/IPolygonDataComittee.md b/docs/v2/previousVersions/IPolygonRollupManagerPrevious.md
similarity index 100%
rename from docs/v2/interfaces/IPolygonDataComittee.md
rename to docs/v2/previousVersions/IPolygonRollupManagerPrevious.md
diff --git a/docs/v2/previousVersions/PolygonRollupBaseEtrogPrevious.md b/docs/v2/previousVersions/PolygonRollupBaseEtrogPrevious.md
index 8515f3191..7863170d9 100644
--- a/docs/v2/previousVersions/PolygonRollupBaseEtrogPrevious.md
+++ b/docs/v2/previousVersions/PolygonRollupBaseEtrogPrevious.md
@@ -14,7 +14,7 @@ To enter and exit of the L2 network will be used a PolygonZkEVMBridge smart cont
contract IERC20Upgradeable _pol,
contract IPolygonZkEVMBridgeV2 _bridgeAddress,
contract PolygonRollupManager _rollupManager
- ) public
+ ) internal
```
@@ -54,6 +54,8 @@ Note if a wrapped token of the bridge is used, the original network and address
```solidity
function sequenceBatches(
struct PolygonRollupBaseEtrogPrevious.BatchData[] batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase
) public
```
@@ -64,6 +66,10 @@ Allows a sequencer to send multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonRollupBaseEtrogPrevious.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
note Pol is not a reentrant token
@@ -230,6 +236,15 @@ Generate Initialize transaction for hte bridge on L2
|`_gasTokenNetwork` | uint32 | Indicates the native network of the token address
|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata
+### _verifyOrigin
+```solidity
+ function _verifyOrigin(
+ ) internal returns (bytes gasTokenMetadata)
+```
+
+
+
+
## Events
### SequenceBatches
```solidity
diff --git a/docs/v2/previousVersions/PolygonRollupManagerPrevious.md b/docs/v2/previousVersions/PolygonRollupManagerPrevious.md
new file mode 100644
index 000000000..e4e702426
--- /dev/null
+++ b/docs/v2/previousVersions/PolygonRollupManagerPrevious.md
@@ -0,0 +1,898 @@
+Contract responsible for managing rollups and the verification of their batches.
+This contract will create and update rollups and store all the hashed sequenced data from them.
+The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of
+them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future.
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ contract IERC20Upgradeable _pol,
+ contract IPolygonZkEVMBridge _bridgeAddress
+ ) public
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
+|`_pol` | contract IERC20Upgradeable | POL token address
+|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
+
+### addNewRollupType
+```solidity
+ function addNewRollupType(
+ address consensusImplementation,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint8 genesis,
+ bytes32 description
+ ) external
+```
+Add a new rollup type
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`consensusImplementation` | address | Consensus implementation
+|`verifier` | contract IVerifierRollup | Verifier address
+|`forkID` | uint64 | ForkID of the verifier
+|`genesis` | uint8 | Genesis block of the rollup
+|`description` | bytes32 | Description of the rollup type
+
+### obsoleteRollupType
+```solidity
+ function obsoleteRollupType(
+ uint32 rollupTypeID
+ ) external
+```
+Obsolete Rollup type
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupTypeID` | uint32 | Rollup type to obsolete
+
+### createNewRollup
+```solidity
+ function createNewRollup(
+ uint32 rollupTypeID,
+ uint64 chainID,
+ address admin,
+ address sequencer,
+ address gasTokenAddress,
+ string sequencerURL,
+ string networkName
+ ) external
+```
+Create a new rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupTypeID` | uint32 | Rollup type to deploy
+|`chainID` | uint64 | ChainID of the rollup, must be a new one, can not have more than 32 bits
+|`admin` | address | Admin of the new created rollup
+|`sequencer` | address | Sequencer of the new created rollup
+|`gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
+Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead
+|`sequencerURL` | string | Sequencer URL of the new created rollup
+|`networkName` | string | Network name of the new created rollup
+
+### addExistingRollup
+```solidity
+ function addExistingRollup(
+ contract IPolygonRollupBase rollupAddress,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ bytes32 genesis,
+ uint8 rollupCompatibilityID
+ ) external
+```
+Add an already deployed rollup
+note that this rollup does not follow any rollupType
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupAddress` | contract IPolygonRollupBase | Rollup address
+|`verifier` | contract IVerifierRollup | Verifier address, must be added before
+|`forkID` | uint64 | Fork id of the added rollup
+|`chainID` | uint64 | Chain id of the added rollup
+|`genesis` | bytes32 | Genesis block for this rollup
+|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
+
+### _addExistingRollup
+```solidity
+ function _addExistingRollup(
+ contract IPolygonRollupBase rollupAddress,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ uint8 rollupCompatibilityID
+ ) internal returns (struct PolygonRollupManagerPrevious.RollupData rollup)
+```
+Add an already deployed rollup
+note that this rollup does not follow any rollupType
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupAddress` | contract IPolygonRollupBase | Rollup address
+|`verifier` | contract IVerifierRollup | Verifier address, must be added before
+|`forkID` | uint64 | Fork id of the added rollup
+|`chainID` | uint64 | Chain id of the added rollup
+|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
+
+### updateRollupByRollupAdmin
+```solidity
+ function updateRollupByRollupAdmin(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID
+ ) external
+```
+Upgrade an existing rollup from the rollup admin address
+This address is able to udpate the rollup with more restrictions that the _UPDATE_ROLLUP_ROLE
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
+
+### updateRollup
+```solidity
+ function updateRollup(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes upgradeData
+ ) external
+```
+Upgrade an existing rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
+|`upgradeData` | bytes | Upgrade data
+
+### _updateRollup
+```solidity
+ function _updateRollup(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes upgradeData
+ ) internal
+```
+Upgrade an existing rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
+|`upgradeData` | bytes | Upgrade data
+
+### rollbackBatches
+```solidity
+ function rollbackBatches(
+ contract IPolygonRollupBase rollupContract,
+ uint64 targetBatch
+ ) external
+```
+Rollback batches of the target rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupContract` | contract IPolygonRollupBase | Rollup consensus proxy address
+|`targetBatch` | uint64 | Batch to rollback up to but not including this batch
+
+### onSequenceBatches
+```solidity
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external returns (uint64)
+```
+Sequence batches, callback called by one of the consensus managed by this contract
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newSequencedBatches` | uint64 | Number of batches sequenced
+|`newAccInputHash` | bytes32 | New accumulate input hash
+
+### verifyBatches
+```solidity
+ function verifyBatches(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) external
+```
+Allows an aggregator to verify multiple batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### verifyBatchesTrustedAggregator
+```solidity
+ function verifyBatchesTrustedAggregator(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) external
+```
+Allows a trusted aggregator to verify multiple batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### _verifyAndRewardBatches
+```solidity
+ function _verifyAndRewardBatches(
+ struct PolygonRollupManagerPrevious.RollupData rollup,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) internal
+```
+Verify and reward batches internal function
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPrevious.RollupData | Rollup Data storage pointer that will be used to the verification
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### _tryConsolidatePendingState
+```solidity
+ function _tryConsolidatePendingState(
+ ) internal
+```
+Internal function to consolidate the state automatically once sequence or verify batches are called
+It tries to consolidate the first and the middle pending state in the queue
+
+
+
+### consolidatePendingState
+```solidity
+ function consolidatePendingState(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) external
+```
+Allows to consolidate any pending state that has already exceed the pendingStateTimeout
+Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Pending state to consolidate
+
+### _consolidatePendingState
+```solidity
+ function _consolidatePendingState(
+ struct PolygonRollupManagerPrevious.RollupData rollup,
+ uint64 pendingStateNum
+ ) internal
+```
+Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPrevious.RollupData | Rollup data storage pointer
+|`pendingStateNum` | uint64 | Pending state to consolidate
+
+### overridePendingState
+```solidity
+ function overridePendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) external
+```
+Allows the trusted aggregator to override the pending state
+if it's possible to prove a different state root given the same batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### proveNonDeterministicPendingState
+```solidity
+ function proveNonDeterministicPendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) external
+```
+Allows activate the emergency state if its possible to prove a different state root given the same batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### _proveDistinctPendingState
+```solidity
+ function _proveDistinctPendingState(
+ struct PolygonRollupManagerPrevious.RollupData rollup,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) internal
+```
+Internal function that proves a different state root given the same batches to verify
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPrevious.RollupData | Rollup Data struct that will be checked
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### _updateBatchFee
+```solidity
+ function _updateBatchFee(
+ struct PolygonRollupManagerPrevious.RollupData newLastVerifiedBatch
+ ) internal
+```
+Function to update the batch fee based on the new verified batches
+The batch fee will not be updated when the trusted aggregator verifies batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newLastVerifiedBatch` | struct PolygonRollupManagerPrevious.RollupData | New last verified batch
+
+### activateEmergencyState
+```solidity
+ function activateEmergencyState(
+ ) external
+```
+Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts
+If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period
+
+
+
+### deactivateEmergencyState
+```solidity
+ function deactivateEmergencyState(
+ ) external
+```
+Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+
+
+
+### _activateEmergencyState
+```solidity
+ function _activateEmergencyState(
+ ) internal
+```
+Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+
+
+
+### setTrustedAggregatorTimeout
+```solidity
+ function setTrustedAggregatorTimeout(
+ uint64 newTrustedAggregatorTimeout
+ ) external
+```
+Set a new pending state timeout
+The timeout can only be lowered, except if emergency state is active
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newTrustedAggregatorTimeout` | uint64 | Trusted aggregator timeout
+
+### setPendingStateTimeout
+```solidity
+ function setPendingStateTimeout(
+ uint64 newPendingStateTimeout
+ ) external
+```
+Set a new trusted aggregator timeout
+The timeout can only be lowered, except if emergency state is active
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newPendingStateTimeout` | uint64 | Trusted aggregator timeout
+
+### setMultiplierBatchFee
+```solidity
+ function setMultiplierBatchFee(
+ uint16 newMultiplierBatchFee
+ ) external
+```
+Set a new multiplier batch fee
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newMultiplierBatchFee` | uint16 | multiplier batch fee
+
+### setVerifyBatchTimeTarget
+```solidity
+ function setVerifyBatchTimeTarget(
+ uint64 newVerifyBatchTimeTarget
+ ) external
+```
+Set a new verify batch time target
+This value will only be relevant once the aggregation is decentralized, so
+the trustedAggregatorTimeout should be zero or very close to zero
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newVerifyBatchTimeTarget` | uint64 | Verify batch time target
+
+### setBatchFee
+```solidity
+ function setBatchFee(
+ uint256 newBatchFee
+ ) external
+```
+Set the current batch fee
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newBatchFee` | uint256 | new batch fee
+
+### getRollupExitRoot
+```solidity
+ function getRollupExitRoot(
+ ) public returns (bytes32)
+```
+Get the current rollup exit root
+Compute using all the local exit roots of all rollups the rollup exit root
+Since it's expected to have no more than 10 rollups in this first version, even if this approach
+has a gas consumption that scales linearly with the rollups added, it's ok
+In a future versions this computation will be done inside the circuit
+
+
+
+### getLastVerifiedBatch
+```solidity
+ function getLastVerifiedBatch(
+ ) public returns (uint64)
+```
+Get the last verified batch
+
+
+
+### _getLastVerifiedBatch
+```solidity
+ function _getLastVerifiedBatch(
+ ) internal returns (uint64)
+```
+Get the last verified batch
+
+
+
+### isPendingStateConsolidable
+```solidity
+ function isPendingStateConsolidable(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) public returns (bool)
+```
+Returns a boolean that indicates if the pendingStateNum is or not consolidable
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup id
+|`pendingStateNum` | uint64 | Pending state number to check
+Note that his function does not check if the pending state currently exists, or if it's consolidated already
+
+### _isPendingStateConsolidable
+```solidity
+ function _isPendingStateConsolidable(
+ struct PolygonRollupManagerPrevious.RollupData rollup,
+ uint64 pendingStateNum
+ ) internal returns (bool)
+```
+Returns a boolean that indicates if the pendingStateNum is or not consolidable
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPrevious.RollupData | Rollup data storage pointer
+|`pendingStateNum` | uint64 | Pending state number to check
+Note that his function does not check if the pending state currently exists, or if it's consolidated already
+
+### calculateRewardPerBatch
+```solidity
+ function calculateRewardPerBatch(
+ ) public returns (uint256)
+```
+Function to calculate the reward to verify a single batch
+
+
+
+### getBatchFee
+```solidity
+ function getBatchFee(
+ ) public returns (uint256)
+```
+Get batch fee
+This function is used instad of the automatic public view one,
+because in a future might change the behaviour and we will be able to mantain the interface
+
+
+
+### getForcedBatchFee
+```solidity
+ function getForcedBatchFee(
+ ) public returns (uint256)
+```
+Get forced batch fee
+
+
+
+### getInputSnarkBytes
+```solidity
+ function getInputSnarkBytes(
+ uint32 rollupID,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) public returns (bytes)
+```
+Function to calculate the input snark bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup id used to calculate the input snark bytes
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`oldStateRoot` | bytes32 | State root before batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+
+### _getInputSnarkBytes
+```solidity
+ function _getInputSnarkBytes(
+ struct PolygonRollupManagerPrevious.RollupData rollup,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) internal returns (bytes)
+```
+Function to calculate the input snark bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPrevious.RollupData | Rollup data storage pointer
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`oldStateRoot` | bytes32 | State root before batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+
+### _checkStateRootInsidePrime
+```solidity
+ function _checkStateRootInsidePrime(
+ uint256 newStateRoot
+ ) internal returns (bool)
+```
+Function to check if the state root is inside of the prime field
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newStateRoot` | uint256 | New State root once the batch is processed
+
+### getRollupBatchNumToStateRoot
+```solidity
+ function getRollupBatchNumToStateRoot(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (bytes32)
+```
+Get rollup state root given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+### getRollupSequencedBatches
+```solidity
+ function getRollupSequencedBatches(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (struct LegacyZKEVMStateVariables.SequencedBatchData)
+```
+Get rollup sequence batches struct given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+### getRollupPendingStateTransitions
+```solidity
+ function getRollupPendingStateTransitions(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (struct LegacyZKEVMStateVariables.PendingState)
+```
+Get rollup sequence pending state struct given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+## Events
+### AddNewRollupType
+```solidity
+ event AddNewRollupType(
+ )
+```
+
+Emitted when a new rollup type is added
+
+### ObsoleteRollupType
+```solidity
+ event ObsoleteRollupType(
+ )
+```
+
+Emitted when a a rolup type is obsoleted
+
+### CreateNewRollup
+```solidity
+ event CreateNewRollup(
+ )
+```
+
+Emitted when a new rollup is created based on a rollupType
+
+### AddExistingRollup
+```solidity
+ event AddExistingRollup(
+ )
+```
+
+Emitted when an existing rollup is added
+
+### UpdateRollup
+```solidity
+ event UpdateRollup(
+ )
+```
+
+Emitted when a rollup is udpated
+
+### OnSequenceBatches
+```solidity
+ event OnSequenceBatches(
+ )
+```
+
+Emitted when a new verifier is added
+
+### VerifyBatches
+```solidity
+ event VerifyBatches(
+ )
+```
+
+Emitted when an aggregator verifies batches
+
+### VerifyBatchesTrustedAggregator
+```solidity
+ event VerifyBatchesTrustedAggregator(
+ )
+```
+
+Emitted when the trusted aggregator verifies batches
+
+### ConsolidatePendingState
+```solidity
+ event ConsolidatePendingState(
+ )
+```
+
+Emitted when pending state is consolidated
+
+### ProveNonDeterministicPendingState
+```solidity
+ event ProveNonDeterministicPendingState(
+ )
+```
+
+Emitted when is proved a different state given the same batches
+
+### OverridePendingState
+```solidity
+ event OverridePendingState(
+ )
+```
+
+Emitted when the trusted aggregator overrides pending state
+
+### RollbackBatches
+```solidity
+ event RollbackBatches(
+ )
+```
+
+Emitted when rollback batches
+
+### SetTrustedAggregatorTimeout
+```solidity
+ event SetTrustedAggregatorTimeout(
+ )
+```
+
+Emitted when is updated the trusted aggregator timeout
+
+### SetPendingStateTimeout
+```solidity
+ event SetPendingStateTimeout(
+ )
+```
+
+Emitted when is updated the pending state timeout
+
+### SetMultiplierBatchFee
+```solidity
+ event SetMultiplierBatchFee(
+ )
+```
+
+Emitted when is updated the multiplier batch fee
+
+### SetVerifyBatchTimeTarget
+```solidity
+ event SetVerifyBatchTimeTarget(
+ )
+```
+
+Emitted when is updated the verify batch timeout
+
+### SetTrustedAggregator
+```solidity
+ event SetTrustedAggregator(
+ )
+```
+
+Emitted when is updated the trusted aggregator address
+
+### SetBatchFee
+```solidity
+ event SetBatchFee(
+ )
+```
+
+Emitted when is updated the batch fee
+
diff --git a/docs/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.md b/docs/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.md
new file mode 100644
index 000000000..c3a659561
--- /dev/null
+++ b/docs/v2/previousVersions/PolygonRollupManagerPreviousV1toV2.md
@@ -0,0 +1,872 @@
+Contract responsible for managing rollups and the verification of their batches.
+This contract will create and update rollups and store all the hashed sequenced data from them.
+The logic for sequence batches is moved to the `consensus` contracts, while the verification of all of
+them will be done in this one. In this way, the proof aggregation of the rollups will be easier on a close future.
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ contract IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager,
+ contract IERC20Upgradeable _pol,
+ contract IPolygonZkEVMBridge _bridgeAddress
+ ) public
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootManager` | contract IPolygonZkEVMGlobalExitRootV2 | Global exit root manager address
+|`_pol` | contract IERC20Upgradeable | POL token address
+|`_bridgeAddress` | contract IPolygonZkEVMBridge | Bridge address
+
+### initialize
+```solidity
+ function initialize(
+ address trustedAggregator,
+ uint64 _pendingStateTimeout,
+ uint64 _trustedAggregatorTimeout,
+ address admin,
+ address timelock,
+ address emergencyCouncil,
+ contract PolygonZkEVMExistentEtrog polygonZkEVM,
+ contract IVerifierRollup zkEVMVerifier,
+ uint64 zkEVMForkID,
+ uint64 zkEVMChainID
+ ) external
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`trustedAggregator` | address | Trusted aggregator address
+|`_pendingStateTimeout` | uint64 | Pending state timeout
+|`_trustedAggregatorTimeout` | uint64 | Trusted aggregator timeout
+|`admin` | address | Admin of the rollup manager
+|`timelock` | address | Timelock address
+|`emergencyCouncil` | address | Emergency council address
+|`polygonZkEVM` | contract PolygonZkEVMExistentEtrog | New deployed Polygon zkEVM which will be initialized wiht previous values
+|`zkEVMVerifier` | contract IVerifierRollup | Verifier of the new zkEVM deployed
+|`zkEVMForkID` | uint64 | Fork id of the new zkEVM deployed
+|`zkEVMChainID` | uint64 | Chain id of the new zkEVM deployed
+
+### addNewRollupType
+```solidity
+ function addNewRollupType(
+ address consensusImplementation,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint8 genesis,
+ bytes32 description
+ ) external
+```
+Add a new rollup type
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`consensusImplementation` | address | Consensus implementation
+|`verifier` | contract IVerifierRollup | Verifier address
+|`forkID` | uint64 | ForkID of the verifier
+|`genesis` | uint8 | Genesis block of the rollup
+|`description` | bytes32 | Description of the rollup type
+
+### obsoleteRollupType
+```solidity
+ function obsoleteRollupType(
+ uint32 rollupTypeID
+ ) external
+```
+Obsolete Rollup type
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupTypeID` | uint32 | Rollup type to obsolete
+
+### createNewRollup
+```solidity
+ function createNewRollup(
+ uint32 rollupTypeID,
+ uint64 chainID,
+ address admin,
+ address sequencer,
+ address gasTokenAddress,
+ string sequencerURL,
+ string networkName
+ ) external
+```
+Create a new rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupTypeID` | uint32 | Rollup type to deploy
+|`chainID` | uint64 | ChainID of the rollup, must be a new one
+|`admin` | address | Admin of the new created rollup
+|`sequencer` | address | Sequencer of the new created rollup
+|`gasTokenAddress` | address | Indicates the token address that will be used to pay gas fees in the new rollup
+Note if a wrapped token of the bridge is used, the original network and address of this wrapped will be used instead
+|`sequencerURL` | string | Sequencer URL of the new created rollup
+|`networkName` | string | Network name of the new created rollup
+
+### addExistingRollup
+```solidity
+ function addExistingRollup(
+ contract IPolygonRollupBase rollupAddress,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ bytes32 genesis,
+ uint8 rollupCompatibilityID
+ ) external
+```
+Add an already deployed rollup
+note that this rollup does not follow any rollupType
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupAddress` | contract IPolygonRollupBase | Rollup address
+|`verifier` | contract IVerifierRollup | Verifier address, must be added before
+|`forkID` | uint64 | Fork id of the added rollup
+|`chainID` | uint64 | Chain id of the added rollup
+|`genesis` | bytes32 | Genesis block for this rollup
+|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
+
+### _addExistingRollup
+```solidity
+ function _addExistingRollup(
+ contract IPolygonRollupBase rollupAddress,
+ contract IVerifierRollup verifier,
+ uint64 forkID,
+ uint64 chainID,
+ uint8 rollupCompatibilityID,
+ uint64 lastVerifiedBatch
+ ) internal returns (struct PolygonRollupManagerPreviousV1toV2.RollupData rollup)
+```
+Add an already deployed rollup
+note that this rollup does not follow any rollupType
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupAddress` | contract IPolygonRollupBase | Rollup address
+|`verifier` | contract IVerifierRollup | Verifier address, must be added before
+|`forkID` | uint64 | Fork id of the added rollup
+|`chainID` | uint64 | Chain id of the added rollup
+|`rollupCompatibilityID` | uint8 | Compatibility ID for the added rollup
+|`lastVerifiedBatch` | uint64 | Last verified batch before adding the rollup
+
+### updateRollup
+```solidity
+ function updateRollup(
+ contract ITransparentUpgradeableProxy rollupContract,
+ uint32 newRollupTypeID,
+ bytes upgradeData
+ ) external
+```
+Upgrade an existing rollup
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupContract` | contract ITransparentUpgradeableProxy | Rollup consensus proxy address
+|`newRollupTypeID` | uint32 | New rolluptypeID to upgrade to
+|`upgradeData` | bytes | Upgrade data
+
+### onSequenceBatches
+```solidity
+ function onSequenceBatches(
+ uint64 newSequencedBatches,
+ bytes32 newAccInputHash
+ ) external returns (uint64)
+```
+Sequence batches, callback called by one of the consensus managed by this contract
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newSequencedBatches` | uint64 | Number of batches sequenced
+|`newAccInputHash` | bytes32 | New accumulate input hash
+
+### verifyBatches
+```solidity
+ function verifyBatches(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) external
+```
+Allows an aggregator to verify multiple batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### verifyBatchesTrustedAggregator
+```solidity
+ function verifyBatchesTrustedAggregator(
+ uint32 rollupID,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) external
+```
+Allows a trusted aggregator to verify multiple batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### _verifyAndRewardBatches
+```solidity
+ function _verifyAndRewardBatches(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData rollup,
+ uint64 pendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ address beneficiary,
+ bytes32[24] proof
+ ) internal
+```
+Verify and reward batches internal function
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPreviousV1toV2.RollupData | Rollup Data storage pointer that will be used to the verification
+|`pendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`beneficiary` | address | Address that will receive the verification reward
+|`proof` | bytes32[24] | Fflonk proof
+
+### _tryConsolidatePendingState
+```solidity
+ function _tryConsolidatePendingState(
+ ) internal
+```
+Internal function to consolidate the state automatically once sequence or verify batches are called
+It tries to consolidate the first and the middle pending state in the queue
+
+
+
+### consolidatePendingState
+```solidity
+ function consolidatePendingState(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) external
+```
+Allows to consolidate any pending state that has already exceed the pendingStateTimeout
+Can be called by the trusted aggregator, which can consolidate any state without the timeout restrictions
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`pendingStateNum` | uint64 | Pending state to consolidate
+
+### _consolidatePendingState
+```solidity
+ function _consolidatePendingState(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData rollup,
+ uint64 pendingStateNum
+ ) internal
+```
+Internal function to consolidate any pending state that has already exceed the pendingStateTimeout
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPreviousV1toV2.RollupData | Rollup data storage pointer
+|`pendingStateNum` | uint64 | Pending state to consolidate
+
+### overridePendingState
+```solidity
+ function overridePendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) external
+```
+Allows the trusted aggregator to override the pending state
+if it's possible to prove a different state root given the same batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### proveNonDeterministicPendingState
+```solidity
+ function proveNonDeterministicPendingState(
+ uint32 rollupID,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) external
+```
+Allows activate the emergency state if its possible to prove a different state root given the same batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### _proveDistinctPendingState
+```solidity
+ function _proveDistinctPendingState(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData rollup,
+ uint64 initPendingStateNum,
+ uint64 finalPendingStateNum,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 newStateRoot,
+ bytes32[24] proof
+ ) internal
+```
+Internal function that proves a different state root given the same batches to verify
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPreviousV1toV2.RollupData | Rollup Data struct that will be checked
+|`initPendingStateNum` | uint64 | Init pending state, 0 if consolidated state is used
+|`finalPendingStateNum` | uint64 | Final pending state, that will be used to compare with the newStateRoot
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+|`proof` | bytes32[24] | Fflonk proof
+
+### _updateBatchFee
+```solidity
+ function _updateBatchFee(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData newLastVerifiedBatch
+ ) internal
+```
+Function to update the batch fee based on the new verified batches
+The batch fee will not be updated when the trusted aggregator verifies batches
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newLastVerifiedBatch` | struct PolygonRollupManagerPreviousV1toV2.RollupData | New last verified batch
+
+### activateEmergencyState
+```solidity
+ function activateEmergencyState(
+ ) external
+```
+Function to activate emergency state, which also enables the emergency mode on both PolygonRollupManager and PolygonZkEVMBridge contracts
+If not called by the owner must not have been aggregated in a _HALT_AGGREGATION_TIMEOUT period and an emergency state was not happened in the same period
+
+
+
+### deactivateEmergencyState
+```solidity
+ function deactivateEmergencyState(
+ ) external
+```
+Function to deactivate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+
+
+
+### _activateEmergencyState
+```solidity
+ function _activateEmergencyState(
+ ) internal
+```
+Internal function to activate emergency state on both PolygonRollupManager and PolygonZkEVMBridge contracts
+
+
+
+### setTrustedAggregatorTimeout
+```solidity
+ function setTrustedAggregatorTimeout(
+ uint64 newTrustedAggregatorTimeout
+ ) external
+```
+Set a new pending state timeout
+The timeout can only be lowered, except if emergency state is active
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newTrustedAggregatorTimeout` | uint64 | Trusted aggregator timeout
+
+### setPendingStateTimeout
+```solidity
+ function setPendingStateTimeout(
+ uint64 newPendingStateTimeout
+ ) external
+```
+Set a new trusted aggregator timeout
+The timeout can only be lowered, except if emergency state is active
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newPendingStateTimeout` | uint64 | Trusted aggregator timeout
+
+### setMultiplierBatchFee
+```solidity
+ function setMultiplierBatchFee(
+ uint16 newMultiplierBatchFee
+ ) external
+```
+Set a new multiplier batch fee
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newMultiplierBatchFee` | uint16 | multiplier batch fee
+
+### setVerifyBatchTimeTarget
+```solidity
+ function setVerifyBatchTimeTarget(
+ uint64 newVerifyBatchTimeTarget
+ ) external
+```
+Set a new verify batch time target
+This value will only be relevant once the aggregation is decentralized, so
+the trustedAggregatorTimeout should be zero or very close to zero
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newVerifyBatchTimeTarget` | uint64 | Verify batch time target
+
+### setBatchFee
+```solidity
+ function setBatchFee(
+ uint256 newBatchFee
+ ) external
+```
+Set the current batch fee
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newBatchFee` | uint256 | new batch fee
+
+### getRollupExitRoot
+```solidity
+ function getRollupExitRoot(
+ ) public returns (bytes32)
+```
+Get the current rollup exit root
+Compute using all the local exit roots of all rollups the rollup exit root
+Since it's expected to have no more than 10 rollups in this first version, even if this approach
+has a gas consumption that scales linearly with the rollups added, it's ok
+In a future versions this computation will be done inside the circuit
+
+
+
+### getLastVerifiedBatch
+```solidity
+ function getLastVerifiedBatch(
+ ) public returns (uint64)
+```
+Get the last verified batch
+
+
+
+### _getLastVerifiedBatch
+```solidity
+ function _getLastVerifiedBatch(
+ ) internal returns (uint64)
+```
+Get the last verified batch
+
+
+
+### isPendingStateConsolidable
+```solidity
+ function isPendingStateConsolidable(
+ uint32 rollupID,
+ uint64 pendingStateNum
+ ) public returns (bool)
+```
+Returns a boolean that indicates if the pendingStateNum is or not consolidable
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup id
+|`pendingStateNum` | uint64 | Pending state number to check
+Note that his function does not check if the pending state currently exists, or if it's consolidated already
+
+### _isPendingStateConsolidable
+```solidity
+ function _isPendingStateConsolidable(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData rollup,
+ uint64 pendingStateNum
+ ) internal returns (bool)
+```
+Returns a boolean that indicates if the pendingStateNum is or not consolidable
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPreviousV1toV2.RollupData | Rollup data storage pointer
+|`pendingStateNum` | uint64 | Pending state number to check
+Note that his function does not check if the pending state currently exists, or if it's consolidated already
+
+### calculateRewardPerBatch
+```solidity
+ function calculateRewardPerBatch(
+ ) public returns (uint256)
+```
+Function to calculate the reward to verify a single batch
+
+
+
+### getBatchFee
+```solidity
+ function getBatchFee(
+ ) public returns (uint256)
+```
+Get batch fee
+This function is used instad of the automatic public view one,
+because in a future might change the behaviour and we will be able to mantain the interface
+
+
+
+### getForcedBatchFee
+```solidity
+ function getForcedBatchFee(
+ ) public returns (uint256)
+```
+Get forced batch fee
+
+
+
+### getInputSnarkBytes
+```solidity
+ function getInputSnarkBytes(
+ uint32 rollupID,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) public returns (bytes)
+```
+Function to calculate the input snark bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup id used to calculate the input snark bytes
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`oldStateRoot` | bytes32 | State root before batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+
+### _getInputSnarkBytes
+```solidity
+ function _getInputSnarkBytes(
+ struct PolygonRollupManagerPreviousV1toV2.RollupData rollup,
+ uint64 initNumBatch,
+ uint64 finalNewBatch,
+ bytes32 newLocalExitRoot,
+ bytes32 oldStateRoot,
+ bytes32 newStateRoot
+ ) internal returns (bytes)
+```
+Function to calculate the input snark bytes
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollup` | struct PolygonRollupManagerPreviousV1toV2.RollupData | Rollup data storage pointer
+|`initNumBatch` | uint64 | Batch which the aggregator starts the verification
+|`finalNewBatch` | uint64 | Last batch aggregator intends to verify
+|`newLocalExitRoot` | bytes32 | New local exit root once the batch is processed
+|`oldStateRoot` | bytes32 | State root before batch is processed
+|`newStateRoot` | bytes32 | New State root once the batch is processed
+
+### _checkStateRootInsidePrime
+```solidity
+ function _checkStateRootInsidePrime(
+ uint256 newStateRoot
+ ) internal returns (bool)
+```
+Function to check if the state root is inside of the prime field
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`newStateRoot` | uint256 | New State root once the batch is processed
+
+### getRollupBatchNumToStateRoot
+```solidity
+ function getRollupBatchNumToStateRoot(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (bytes32)
+```
+Get rollup state root given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+### getRollupSequencedBatches
+```solidity
+ function getRollupSequencedBatches(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (struct LegacyZKEVMStateVariables.SequencedBatchData)
+```
+Get rollup sequence batches struct given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+### getRollupPendingStateTransitions
+```solidity
+ function getRollupPendingStateTransitions(
+ uint32 rollupID,
+ uint64 batchNum
+ ) public returns (struct LegacyZKEVMStateVariables.PendingState)
+```
+Get rollup sequence pending state struct given a batch number
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`rollupID` | uint32 | Rollup identifier
+|`batchNum` | uint64 | Batch number
+
+## Events
+### AddNewRollupType
+```solidity
+ event AddNewRollupType(
+ )
+```
+
+Emitted when a new rollup type is added
+
+### ObsoleteRollupType
+```solidity
+ event ObsoleteRollupType(
+ )
+```
+
+Emitted when a a rolup type is obsoleted
+
+### CreateNewRollup
+```solidity
+ event CreateNewRollup(
+ )
+```
+
+Emitted when a new rollup is created based on a rollupType
+
+### AddExistingRollup
+```solidity
+ event AddExistingRollup(
+ )
+```
+
+Emitted when an existing rollup is added
+
+### UpdateRollup
+```solidity
+ event UpdateRollup(
+ )
+```
+
+Emitted when a rollup is udpated
+
+### OnSequenceBatches
+```solidity
+ event OnSequenceBatches(
+ )
+```
+
+Emitted when a new verifier is added
+
+### VerifyBatches
+```solidity
+ event VerifyBatches(
+ )
+```
+
+Emitted when an aggregator verifies batches
+
+### VerifyBatchesTrustedAggregator
+```solidity
+ event VerifyBatchesTrustedAggregator(
+ )
+```
+
+Emitted when the trusted aggregator verifies batches
+
+### ConsolidatePendingState
+```solidity
+ event ConsolidatePendingState(
+ )
+```
+
+Emitted when pending state is consolidated
+
+### ProveNonDeterministicPendingState
+```solidity
+ event ProveNonDeterministicPendingState(
+ )
+```
+
+Emitted when is proved a different state given the same batches
+
+### OverridePendingState
+```solidity
+ event OverridePendingState(
+ )
+```
+
+Emitted when the trusted aggregator overrides pending state
+
+### SetTrustedAggregatorTimeout
+```solidity
+ event SetTrustedAggregatorTimeout(
+ )
+```
+
+Emitted when is updated the trusted aggregator timeout
+
+### SetPendingStateTimeout
+```solidity
+ event SetPendingStateTimeout(
+ )
+```
+
+Emitted when is updated the pending state timeout
+
+### SetMultiplierBatchFee
+```solidity
+ event SetMultiplierBatchFee(
+ )
+```
+
+Emitted when is updated the multiplier batch fee
+
+### SetVerifyBatchTimeTarget
+```solidity
+ event SetVerifyBatchTimeTarget(
+ )
+```
+
+Emitted when is updated the verify batch timeout
+
+### SetTrustedAggregator
+```solidity
+ event SetTrustedAggregator(
+ )
+```
+
+Emitted when is updated the trusted aggregator address
+
+### SetBatchFee
+```solidity
+ event SetBatchFee(
+ )
+```
+
+Emitted when is updated the batch fee
+
diff --git a/docs/v2/previousVersions/PolygonValidiumEtrogPrevious.md b/docs/v2/previousVersions/PolygonValidiumEtrogPrevious.md
index 25da8a3ff..43a0bfb83 100644
--- a/docs/v2/previousVersions/PolygonValidiumEtrogPrevious.md
+++ b/docs/v2/previousVersions/PolygonValidiumEtrogPrevious.md
@@ -31,6 +31,8 @@ It is advised to use timelocks for the admin address in case of Validium since i
```solidity
function sequenceBatchesValidium(
struct PolygonValidiumEtrogPrevious.ValidiumBatchData[] batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase,
bytes dataAvailabilityMessage
) external
@@ -42,6 +44,10 @@ Allows a sequencer to send multiple batches
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonValidiumEtrogPrevious.ValidiumBatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
|`dataAvailabilityMessage` | bytes | Byte array containing the signatures and all the addresses of the committee in ascending order
[signature 0, ..., signature requiredAmountOfSignatures -1, address 0, ... address N]
@@ -52,17 +58,24 @@ note Pol is not a reentrant token
```solidity
function sequenceBatches(
struct PolygonRollupBaseEtrogPrevious.BatchData[] batches,
+ uint64 maxSequenceTimestamp,
+ uint64 initSequencedBatch,
address l2Coinbase
) public
```
-Allows a sequencer to send multiple batches sending all the data, and without using the dataAvailabilityProtocol
+Allows a sequencer to send multiple batches
#### Parameters:
| Name | Type | Description |
| :--- | :--- | :------------------------------------------------------------------- |
|`batches` | struct PolygonRollupBaseEtrogPrevious.BatchData[] | Struct array which holds the necessary data to append new batches to the sequence
+|`maxSequenceTimestamp` | uint64 | Max timestamp of the sequence. This timestamp must be inside a safety range (actual + 36 seconds).
+This timestamp should be equal or higher of the last block inside the sequence, otherwise this batch will be invalidated by circuit.
+|`initSequencedBatch` | uint64 | This parameter must match the current last batch sequenced.
+This will be a protection for the sequencer to avoid sending undesired data
|`l2Coinbase` | address | Address that will receive the fees from L2
+note Pol is not a reentrant token
### setDataAvailabilityProtocol
```solidity
diff --git a/docs/v2/sovereignChains/BridgeL2SovereignChain.md b/docs/v2/sovereignChains/BridgeL2SovereignChain.md
new file mode 100644
index 000000000..a9d4bda92
--- /dev/null
+++ b/docs/v2/sovereignChains/BridgeL2SovereignChain.md
@@ -0,0 +1,338 @@
+Sovereign chains bridge that will be deployed on all Sovereign chains
+Contract responsible to manage the token interactions with other networks
+This contract is not meant to replace the current zkEVM bridge contract, but deployed on sovereign networks
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ ) public
+```
+Disable initializers on the implementation following the best practices
+
+
+
+### initialize
+```solidity
+ function initialize(
+ uint32 _networkID,
+ address _gasTokenAddress,
+ uint32 _gasTokenNetwork,
+ contract IBasePolygonZkEVMGlobalExitRoot _globalExitRootManager,
+ address _polygonRollupManager,
+ bytes _gasTokenMetadata,
+ address _bridgeManager,
+ address _sovereignWETHAddress,
+ bool _sovereignWETHAddressIsNotMintable
+ ) public
+```
+The value of `_polygonRollupManager` on the L2 deployment of the contract will be address(0), so
+emergency state is not possible for the L2 deployment of the bridge, intentionally
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_networkID` | uint32 | networkID
+|`_gasTokenAddress` | address | gas token address
+|`_gasTokenNetwork` | uint32 | gas token network
+|`_globalExitRootManager` | contract IBasePolygonZkEVMGlobalExitRoot | global exit root manager address
+|`_polygonRollupManager` | address | Rollup manager address
+|`_gasTokenMetadata` | bytes | Abi encoded gas token metadata
+|`_bridgeManager` | address | bridge manager address
+|`_sovereignWETHAddress` | address | sovereign WETH address
+|`_sovereignWETHAddressIsNotMintable` | bool | Flag to indicate if the wrapped ETH is not mintable
+
+### initialize
+```solidity
+ function initialize(
+ ) external
+```
+Override the function to prevent the contract from being initialized with this initializer
+
+
+
+### setMultipleSovereignTokenAddress
+```solidity
+ function setMultipleSovereignTokenAddress(
+ uint32[] originNetworks,
+ address[] originTokenAddresses,
+ address[] sovereignTokenAddresses,
+ bool[] isNotMintable
+ ) external
+```
+Remap multiple wrapped tokens to a new sovereign token address
+
+This function is a "multi/batch call" to `setSovereignTokenAddress`
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`originNetworks` | uint32[] | Array of Origin networks
+|`originTokenAddresses` | address[] | Array od Origin token addresses, 0 address is reserved for ether
+|`sovereignTokenAddresses` | address[] | Array of Addresses of the sovereign wrapped token
+|`isNotMintable` | bool[] | Array of Flags to indicate if the wrapped token is not mintable
+
+### _setSovereignTokenAddress
+```solidity
+ function _setSovereignTokenAddress(
+ uint32 originNetwork,
+ address originTokenAddress,
+ address sovereignTokenAddress,
+ bool isNotMintable
+ ) internal
+```
+Remap a wrapped token to a new sovereign token address
+If this function is called multiple times for the same existingTokenAddress,
+this will override the previous calls and only keep the last sovereignTokenAddress.
+The tokenInfoToWrappedToken mapping value is replaced by the new sovereign address but it's not the case for the wrappedTokenToTokenInfo map where the value is added, this way user will always be able to withdraw their tokens
+The number of decimals between sovereign token and origin token is not checked, it doesn't affect the bridge functionality but the UI.
+
+This function is used to allow any existing token to be mapped with
+ origin token.
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`originNetwork` | uint32 | Origin network
+|`originTokenAddress` | address | Origin token address, 0 address is reserved for gas token address. If WETH address is zero, means this gas token is ether, else means is a custom erc20 gas token
+|`sovereignTokenAddress` | address | Address of the sovereign wrapped token
+|`isNotMintable` | bool | Flag to indicate if the wrapped token is not mintable
+
+### removeLegacySovereignTokenAddress
+```solidity
+ function removeLegacySovereignTokenAddress(
+ address legacySovereignTokenAddress
+ ) external
+```
+Remove the address of a remapped token from the mapping. Used to stop supporting legacy sovereign tokens
+It also removes the token from the isNotMintable mapping
+Although the token is removed from the mapping, the user will still be able to withdraw their tokens using tokenInfoToWrappedToken mapping
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`legacySovereignTokenAddress` | address | Address of the sovereign wrapped token
+
+### setSovereignWETHAddress
+```solidity
+ function setSovereignWETHAddress(
+ address sovereignWETHTokenAddress,
+ bool isNotMintable
+ ) external
+```
+Set the custom wrapper for weth
+If this function is called multiple times this will override the previous calls and only keep the last WETHToken.
+WETH will not maintain legacy versions.Users easily should be able to unwrapp the legacy WETH and unwrapp it with the new one.
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`sovereignWETHTokenAddress` | address | Address of the sovereign weth token
+|`isNotMintable` | bool | Flag to indicate if the wrapped token is not mintable
+
+### migrateLegacyToken
+```solidity
+ function migrateLegacyToken(
+ address legacyTokenAddress,
+ uint256 amount
+ ) external
+```
+Moves old native or remapped token (legacy) to the new mapped token. If the token is mintable, it will be burnt and minted, otherwise it will be transferred
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`legacyTokenAddress` | address | Address of legacy token to migrate
+|`amount` | uint256 | Legacy token balance to migrate
+
+### unsetMultipleClaimedBitmap
+```solidity
+ function unsetMultipleClaimedBitmap(
+ uint32[] leafIndexes,
+ uint32[] sourceBridgeNetworks
+ ) external
+```
+unset multiple claims from the claimedBitmap
+
+This function is a "multi/batch call" to `unsetClaimedBitmap`
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`leafIndexes` | uint32[] | Array of Index
+|`sourceBridgeNetworks` | uint32[] | Array of Origin networks
+
+### setBridgeManager
+```solidity
+ function setBridgeManager(
+ address _bridgeManager
+ ) external
+```
+Updated bridge manager address, recommended to set a timelock at this address after bootstrapping phase
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_bridgeManager` | address | Bridge manager address
+
+### _bridgeWrappedAsset
+```solidity
+ function _bridgeWrappedAsset(
+ contract TokenWrapped tokenWrapped,
+ uint256 amount
+ ) internal
+```
+Burn tokens from wrapped token to execute the bridge, if the token is not mintable it will be transferred
+note This function has been extracted to be able to override it by other contracts like Bridge2SovereignChain
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`tokenWrapped` | contract TokenWrapped | Wrapped token to burnt
+|`amount` | uint256 | Amount of tokens
+
+### _claimWrappedAsset
+```solidity
+ function _claimWrappedAsset(
+ contract TokenWrapped tokenWrapped,
+ address destinationAddress,
+ uint256 amount
+ ) internal
+```
+Mints tokens from wrapped token to proceed with the claim, if the token is not mintable it will be transferred
+note This function has been extracted to be able to override it by other contracts like BridgeL2SovereignChain
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`tokenWrapped` | contract TokenWrapped | Wrapped token to mint
+|`destinationAddress` | address | Minted token receiver
+|`amount` | uint256 | Amount of tokens
+
+### isClaimed
+```solidity
+ function isClaimed(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) external returns (bool)
+```
+Function to check if an index is claimed or not
+
+function overridden to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`leafIndex` | uint32 | Index
+|`sourceBridgeNetwork` | uint32 | Origin network
+
+### _setAndCheckClaimed
+```solidity
+ function _setAndCheckClaimed(
+ uint32 leafIndex,
+ uint32 sourceBridgeNetwork
+ ) internal
+```
+Function to check that an index is not claimed and set it as claimed
+
+function overridden to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`leafIndex` | uint32 | Index
+|`sourceBridgeNetwork` | uint32 | Origin network
+
+### _permit
+```solidity
+ function _permit(
+ address amount,
+ uint256 permitData
+ ) internal
+```
+Function to call token permit method of extended ERC20
+
+function overridden from PolygonZkEVMBridgeV2 to improve a bit the performance and bytecode not checking unnecessary conditions for sovereign chains context
+ + @param token ERC20 token address
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`amount` | address | Quantity that is expected to be allowed
+|`permitData` | uint256 | Raw data of the call `permit` of the token
+
+### activateEmergencyState
+```solidity
+ function activateEmergencyState(
+ ) external
+```
+
+
+
+
+### deactivateEmergencyState
+```solidity
+ function deactivateEmergencyState(
+ ) external
+```
+
+
+
+
+## Events
+### SetBridgeManager
+```solidity
+ event SetBridgeManager(
+ )
+```
+
+Emitted when a bridge manager is updated
+
+### UnsetClaim
+```solidity
+ event UnsetClaim(
+ )
+```
+
+Emitted when a claim is unset
+
+### SetSovereignTokenAddress
+```solidity
+ event SetSovereignTokenAddress(
+ )
+```
+
+Emitted when a token address is remapped by a sovereign token address
+
+### MigrateLegacyToken
+```solidity
+ event MigrateLegacyToken(
+ )
+```
+
+Emitted when a legacy token is migrated to a new token
+
+### RemoveLegacySovereignTokenAddress
+```solidity
+ event RemoveLegacySovereignTokenAddress(
+ )
+```
+
+Emitted when a remapped token is removed from mapping
+
+### SetSovereignWETHAddress
+```solidity
+ event SetSovereignWETHAddress(
+ )
+```
+
+Emitted when a WETH address is remapped by a sovereign WETH address
+
diff --git a/docs/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.md b/docs/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.md
new file mode 100644
index 000000000..7e94fc54b
--- /dev/null
+++ b/docs/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.md
@@ -0,0 +1,122 @@
+Contract responsible for managing the exit roots for the Sovereign chains and global exit roots
+
+
+## Functions
+### constructor
+```solidity
+ function constructor(
+ address _bridgeAddress
+ ) public
+```
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_bridgeAddress` | address | PolygonZkEVMBridge contract address
+
+### initialize
+```solidity
+ function initialize(
+ address _globalExitRootUpdater,
+ address _globalExitRootRemover
+ ) external
+```
+Initialize contract
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootUpdater` | address | setting the globalExitRootUpdater.
+|`_globalExitRootRemover` | address | In case of initializing a chain with Full execution proofs, this address should be set to zero, otherwise, some malicious sequencer could insert invalid global exit roots, claim and go back and the execution would be correctly proved.
+
+### insertGlobalExitRoot
+```solidity
+ function insertGlobalExitRoot(
+ bytes32 _newRoot
+ ) external
+```
+Insert a new global exit root
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_newRoot` | bytes32 | new global exit root to insert
+
+### removeLastGlobalExitRoots
+```solidity
+ function removeLastGlobalExitRoots(
+ bytes32[] gersToRemove
+ ) external
+```
+Remove last global exit roots
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`gersToRemove` | bytes32[] | Array of gers to remove in inserted order where first element of the array is the last inserted
+
+### setGlobalExitRootUpdater
+```solidity
+ function setGlobalExitRootUpdater(
+ address _globalExitRootUpdater
+ ) external
+```
+Set the globalExitRootUpdater
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootUpdater` | address | new globalExitRootUpdater address
+
+### setGlobalExitRootRemover
+```solidity
+ function setGlobalExitRootRemover(
+ address _globalExitRootRemover
+ ) external
+```
+Set the globalExitRootRemover
+
+
+#### Parameters:
+| Name | Type | Description |
+| :--- | :--- | :------------------------------------------------------------------- |
+|`_globalExitRootRemover` | address | new globalExitRootRemover address
+
+## Events
+### InsertGlobalExitRoot
+```solidity
+ event InsertGlobalExitRoot(
+ )
+```
+
+Emitted when a new global exit root is inserted
+
+### RemoveLastGlobalExitRoot
+```solidity
+ event RemoveLastGlobalExitRoot(
+ )
+```
+
+Emitted when the last global exit root is removed
+
+### SetGlobalExitRootUpdater
+```solidity
+ event SetGlobalExitRootUpdater(
+ )
+```
+
+Emitted when the globalExitRootUpdater is set
+
+### SetGlobalExitRootRemover
+```solidity
+ event SetGlobalExitRootRemover(
+ )
+```
+
+Emitted when the globalExitRootRemover is set
+
diff --git a/foundry.toml b/foundry.toml
new file mode 100644
index 000000000..f2af5126c
--- /dev/null
+++ b/foundry.toml
@@ -0,0 +1,5 @@
+[profile.default]
+src = 'contracts'
+# *.ignore files are added to the .gitignore file
+out = 'folder.ignore'
+libs = ['node_modules']
diff --git a/hardhat.config.ts b/hardhat.config.ts
index 17f2358f1..0d104c532 100644
--- a/hardhat.config.ts
+++ b/hardhat.config.ts
@@ -2,6 +2,7 @@ import "dotenv/config";
import "@nomicfoundation/hardhat-toolbox";
import "@openzeppelin/hardhat-upgrades";
import "hardhat-dependency-compiler";
+import "hardhat-switch-network";
import {HardhatUserConfig} from "hardhat/config";
@@ -75,12 +76,22 @@ const config: HardhatUserConfig = {
},
],
overrides: {
+ "contracts/v2/sovereignChains/BridgeL2SovereignChain.sol": {
+ version: "0.8.20",
+ settings: {
+ optimizer: {
+ enabled: true,
+ runs: 20,
+ },
+ evmVersion: "shanghai",
+ }, // try yul optimizer
+ },
"contracts/v2/PolygonRollupManager.sol": {
version: "0.8.20",
settings: {
optimizer: {
enabled: true,
- runs: 500,
+ runs: 500, // Should have the same optimizations as PolygonTransparentProxy
},
evmVersion: "shanghai",
}, // try yul optimizer
@@ -100,7 +111,7 @@ const config: HardhatUserConfig = {
settings: {
optimizer: {
enabled: true,
- runs: 500,
+ runs: 500, // Should have the same optimizations as PolygonTransparentProxy
},
evmVersion: "shanghai",
}, // try yul optimizer
@@ -110,7 +121,7 @@ const config: HardhatUserConfig = {
settings: {
optimizer: {
enabled: true,
- runs: 10,
+ runs: 500, // Should have the same optimizations as PolygonTransparentProxy
},
evmVersion: "shanghai",
}, // try yul optimizer
@@ -270,8 +281,8 @@ const config: HardhatUserConfig = {
network: "polygonZKEVMTestnet",
chainId: 2442,
urls: {
- apiURL: "https://explorer-ui.cardona.zkevm-rpc.com/api",
- browserURL: "https://explorer-ui.cardona.zkevm-rpc.com",
+ apiURL: "https://api-cardona-zkevm.polygonscan.com/api",
+ browserURL: "https://cardona-zkevm.polygonscan.com/",
},
},
{
diff --git a/package-lock.json b/package-lock.json
index 2455a3e4c..89c183ade 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,23089 +1,23352 @@
{
- "name": "@0xpolygonhermez/zkevm-contracts",
- "version": "3.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "@0xpolygonhermez/zkevm-contracts",
- "version": "3.0.0",
- "license": "pending",
- "devDependencies": {
- "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main",
- "@nomicfoundation/hardhat-toolbox": "^3.0.0",
- "@openzeppelin/contracts": "4.8.2",
- "@openzeppelin/contracts-upgradeable": "4.8.2",
- "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0",
- "@openzeppelin/hardhat-upgrades": "2.5.0",
- "@types/yargs": "^17.0.28",
- "circomlibjs": "0.1.1",
- "dotenv": "^8.6.0",
- "eslint": "^8.51.0",
- "eslint-config-airbnb-base": "^15.0.0",
- "eslint-plugin-mocha": "^9.0.0",
- "ethereum-waffle": "^3.4.4",
- "ffjavascript": "^0.2.60",
- "hardhat": "2.20.0",
- "hardhat-dependency-compiler": "^1.1.3",
- "prettier": "^2.8.8",
- "prettier-plugin-solidity": "^1.1.3",
- "solc-0.8": "npm:solc@0.8.20",
- "solidity-docgen": "^0.5.17"
- }
- },
- "node_modules/@0xpolygonhermez/zkevm-commonjs": {
- "version": "2.0.0",
- "resolved": "git+ssh://git@github.com/0xPolygonHermez/zkevm-commonjs.git#06a731c47a1c1642b34aa4c9a496e61e017f8b47",
- "dev": true,
- "license": "pending",
- "dependencies": {
- "@ethereumjs/block": "^3.6.2",
- "@ethereumjs/tx": "^3.4.0",
- "@polygon-hermez/common": "2.6.4",
- "@polygon-hermez/vm": "5.7.36",
- "ethereumjs-util": "^7.1.4",
- "ethers": "^5.5.4",
- "ffjavascript": "^0.2.55",
- "lodash": "^4.17.21",
- "pg": "^8.7.1"
- }
- },
- "node_modules/@0xpolygonhermez/zkevm-commonjs/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@adraffy/ens-normalize": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz",
- "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/@aws-crypto/sha256-js": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz",
- "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==",
- "dev": true,
- "dependencies": {
- "@aws-crypto/util": "^1.2.2",
- "@aws-sdk/types": "^3.1.0",
- "tslib": "^1.11.1"
- }
- },
- "node_modules/@aws-crypto/util": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz",
- "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==",
- "dev": true,
- "dependencies": {
- "@aws-sdk/types": "^3.1.0",
- "@aws-sdk/util-utf8-browser": "^3.0.0",
- "tslib": "^1.11.1"
- }
- },
- "node_modules/@aws-sdk/types": {
- "version": "3.468.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz",
- "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==",
- "dev": true,
- "dependencies": {
- "@smithy/types": "^2.7.0",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@aws-sdk/types/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@aws-sdk/util-utf8-browser": {
- "version": "3.259.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
- "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.3.1"
- }
- },
- "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@cspotcode/source-map-support": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
- "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/trace-mapping": "0.3.9"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@ensdomains/ens": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz",
- "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==",
- "deprecated": "Please use @ensdomains/ens-contracts",
- "dev": true,
- "dependencies": {
- "bluebird": "^3.5.2",
- "eth-ens-namehash": "^2.0.8",
- "solc": "^0.4.20",
- "testrpc": "0.0.1",
- "web3-utils": "^1.0.0-beta.31"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
- },
- "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
- "dev": true,
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/require-from-string": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
- "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/solc": {
- "version": "0.4.26",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz",
- "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==",
- "dev": true,
- "dependencies": {
- "fs-extra": "^0.30.0",
- "memorystream": "^0.3.1",
- "require-from-string": "^1.1.0",
- "semver": "^5.3.0",
- "yargs": "^4.7.1"
- },
- "bin": {
- "solcjs": "solcjs"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
- "dev": true,
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/y18n": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
- "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
- "dev": true
- },
- "node_modules/@ensdomains/ens/node_modules/yargs": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
- "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==",
- "dev": true,
- "dependencies": {
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "lodash.assign": "^4.0.3",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.1",
- "which-module": "^1.0.0",
- "window-size": "^0.2.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^2.4.1"
- }
- },
- "node_modules/@ensdomains/ens/node_modules/yargs-parser": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
- "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==",
- "dev": true,
- "dependencies": {
- "camelcase": "^3.0.0",
- "lodash.assign": "^4.0.6"
- }
- },
- "node_modules/@ensdomains/resolver": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz",
- "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==",
- "deprecated": "Please use @ensdomains/ens-contracts",
- "dev": true
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
- "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
- "dev": true,
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.51.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz",
- "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@ethereum-waffle/chai": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz",
- "integrity": "sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==",
- "dev": true,
- "dependencies": {
- "@ethereum-waffle/provider": "^3.4.4",
- "ethers": "^5.5.2"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/@ethereum-waffle/chai/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz",
- "integrity": "sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==",
- "dev": true,
- "dependencies": {
- "@resolver-engine/imports": "^0.3.3",
- "@resolver-engine/imports-fs": "^0.3.3",
- "@typechain/ethers-v5": "^2.0.0",
- "@types/mkdirp": "^0.5.2",
- "@types/node-fetch": "^2.5.5",
- "ethers": "^5.0.1",
- "mkdirp": "^0.5.1",
- "node-fetch": "^2.6.1",
- "solc": "^0.6.3",
- "ts-generator": "^0.1.1",
- "typechain": "^3.0.0"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz",
- "integrity": "sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==",
- "dev": true,
- "dependencies": {
- "ethers": "^5.0.2"
- },
- "peerDependencies": {
- "ethers": "^5.0.0",
- "typechain": "^3.0.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/command-line-args": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz",
- "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==",
- "dev": true,
- "dependencies": {
- "array-back": "^2.0.0",
- "find-replace": "^1.0.3",
- "typical": "^2.6.1"
- },
- "bin": {
- "command-line-args": "bin/cli.js"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/find-replace": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
- "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==",
- "dev": true,
- "dependencies": {
- "array-back": "^1.0.4",
- "test-value": "^2.1.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/find-replace/node_modules/array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/ts-essentials": {
- "version": "6.0.7",
- "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz",
- "integrity": "sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==",
- "dev": true,
- "peerDependencies": {
- "typescript": ">=3.7.0"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/typechain": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz",
- "integrity": "sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==",
- "dev": true,
- "dependencies": {
- "command-line-args": "^4.0.7",
- "debug": "^4.1.1",
- "fs-extra": "^7.0.0",
- "js-sha3": "^0.8.0",
- "lodash": "^4.17.15",
- "ts-essentials": "^6.0.3",
- "ts-generator": "^0.1.1"
- },
- "bin": {
- "typechain": "dist/cli/cli.js"
- }
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
- "dev": true
- },
- "node_modules/@ethereum-waffle/compiler/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/@ethereum-waffle/ens": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz",
- "integrity": "sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==",
- "dev": true,
- "dependencies": {
- "@ensdomains/ens": "^0.4.4",
- "@ensdomains/resolver": "^0.2.4",
- "ethers": "^5.5.2"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/@ethereum-waffle/ens/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@ethereum-waffle/mock-contract": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz",
- "integrity": "sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==",
- "dev": true,
- "dependencies": {
- "@ethersproject/abi": "^5.5.0",
- "ethers": "^5.5.2"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/@ethereum-waffle/mock-contract/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@ethereum-waffle/provider": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz",
- "integrity": "sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==",
- "dev": true,
- "dependencies": {
- "@ethereum-waffle/ens": "^3.4.4",
- "ethers": "^5.5.2",
- "ganache-core": "^2.13.2",
- "patch-package": "^6.2.2",
- "postinstall-postinstall": "^2.1.0"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/@ethereum-waffle/provider/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@ethereumjs/block": {
- "version": "3.6.3",
- "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz",
- "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/common": "^2.6.5",
- "@ethereumjs/tx": "^3.5.2",
- "ethereumjs-util": "^7.1.5",
- "merkle-patricia-tree": "^4.2.4"
- }
- },
- "node_modules/@ethereumjs/blockchain": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz",
- "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/block": "^3.6.2",
- "@ethereumjs/common": "^2.6.4",
- "@ethereumjs/ethash": "^1.1.0",
- "debug": "^4.3.3",
- "ethereumjs-util": "^7.1.5",
- "level-mem": "^5.0.1",
- "lru-cache": "^5.1.1",
- "semaphore-async-await": "^1.5.1"
- }
- },
- "node_modules/@ethereumjs/common": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz",
- "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==",
- "dev": true,
- "dependencies": {
- "crc-32": "^1.2.0",
- "ethereumjs-util": "^7.1.5"
- }
- },
- "node_modules/@ethereumjs/ethash": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz",
- "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/block": "^3.5.0",
- "@types/levelup": "^4.3.0",
- "buffer-xor": "^2.0.1",
- "ethereumjs-util": "^7.1.1",
- "miller-rabin": "^4.0.0"
- }
- },
- "node_modules/@ethereumjs/rlp": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz",
- "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==",
- "dev": true,
- "bin": {
- "rlp": "bin/rlp"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@ethereumjs/tx": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz",
- "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/common": "^2.6.4",
- "ethereumjs-util": "^7.1.5"
- }
- },
- "node_modules/@ethereumjs/util": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz",
- "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/rlp": "^4.0.1",
- "ethereum-cryptography": "^2.0.0",
- "micro-ftch": "^0.3.1"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@ethereumjs/util/node_modules/@noble/curves": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz",
- "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "1.3.1"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@ethereumjs/util/node_modules/@noble/hashes": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz",
- "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
- "dev": true,
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz",
- "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==",
- "dev": true,
- "dependencies": {
- "@noble/curves": "1.1.0",
- "@noble/hashes": "1.3.1",
- "@scure/bip32": "1.3.1",
- "@scure/bip39": "1.2.1"
- }
- },
- "node_modules/@ethersproject/abi": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
- "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/hash": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/abstract-provider": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
- "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/networks": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0",
- "@ethersproject/web": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/abstract-signer": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
- "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-provider": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/address": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
- "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/rlp": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/base64": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
- "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/basex": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
- "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/properties": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/bignumber": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
- "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "bn.js": "^5.2.1"
- }
- },
- "node_modules/@ethersproject/bytes": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
- "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/constants": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
- "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bignumber": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/contracts": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
- "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "^5.7.0",
- "@ethersproject/abstract-provider": "^5.7.0",
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/hash": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
- "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/base64": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/hdnode": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
- "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/basex": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/pbkdf2": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0",
- "@ethersproject/signing-key": "^5.7.0",
- "@ethersproject/strings": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0",
- "@ethersproject/wordlists": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/json-wallets": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
- "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/hdnode": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/pbkdf2": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/random": "^5.7.0",
- "@ethersproject/strings": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0",
- "aes-js": "3.0.0",
- "scrypt-js": "3.0.1"
- }
- },
- "node_modules/@ethersproject/json-wallets/node_modules/aes-js": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
- "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==",
- "dev": true
- },
- "node_modules/@ethersproject/keccak256": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
- "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "js-sha3": "0.8.0"
- }
- },
- "node_modules/@ethersproject/logger": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
- "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ]
- },
- "node_modules/@ethersproject/networks": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
- "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/pbkdf2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
- "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/properties": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
- "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/providers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
- "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-provider": "^5.7.0",
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/base64": "^5.7.0",
- "@ethersproject/basex": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/hash": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/networks": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/random": "^5.7.0",
- "@ethersproject/rlp": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0",
- "@ethersproject/strings": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0",
- "@ethersproject/web": "^5.7.0",
- "bech32": "1.1.4",
- "ws": "7.4.6"
- }
- },
- "node_modules/@ethersproject/providers/node_modules/ws": {
- "version": "7.4.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
- "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
- "dev": true,
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/@ethersproject/random": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
- "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/rlp": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
- "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/sha2": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
- "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "hash.js": "1.1.7"
- }
- },
- "node_modules/@ethersproject/signing-key": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
- "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "bn.js": "^5.2.1",
- "elliptic": "6.5.4",
- "hash.js": "1.1.7"
- }
- },
- "node_modules/@ethersproject/solidity": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
- "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/sha2": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/strings": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
- "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/transactions": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
- "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/rlp": "^5.7.0",
- "@ethersproject/signing-key": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/units": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
- "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/constants": "^5.7.0",
- "@ethersproject/logger": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/wallet": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
- "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abstract-provider": "^5.7.0",
- "@ethersproject/abstract-signer": "^5.7.0",
- "@ethersproject/address": "^5.7.0",
- "@ethersproject/bignumber": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/hash": "^5.7.0",
- "@ethersproject/hdnode": "^5.7.0",
- "@ethersproject/json-wallets": "^5.7.0",
- "@ethersproject/keccak256": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/random": "^5.7.0",
- "@ethersproject/signing-key": "^5.7.0",
- "@ethersproject/transactions": "^5.7.0",
- "@ethersproject/wordlists": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/web": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
- "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/base64": "^5.7.0",
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "node_modules/@ethersproject/wordlists": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
- "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/bytes": "^5.7.0",
- "@ethersproject/hash": "^5.7.0",
- "@ethersproject/logger": "^5.7.0",
- "@ethersproject/properties": "^5.7.0",
- "@ethersproject/strings": "^5.7.0"
- }
- },
- "node_modules/@fastify/busboy": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
- "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==",
- "dev": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.11",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
- "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
- "dev": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
- "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- }
- },
- "node_modules/@metamask/eth-sig-util": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz",
- "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==",
- "dev": true,
- "dependencies": {
- "ethereumjs-abi": "^0.6.8",
- "ethereumjs-util": "^6.2.1",
- "ethjs-util": "^0.1.6",
- "tweetnacl": "^1.0.3",
- "tweetnacl-util": "^0.15.1"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@metamask/eth-sig-util/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "dev": true,
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/@noble/curves": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@noble/hashes": "1.3.2"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@noble/hashes": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
- "dev": true,
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@noble/secp256k1": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz",
- "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-block": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz",
- "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-trie": "6.0.4",
- "@nomicfoundation/ethereumjs-tx": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-blockchain": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz",
- "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-block": "5.0.4",
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-ethash": "3.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-trie": "6.0.4",
- "@nomicfoundation/ethereumjs-tx": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "lru-cache": "^10.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-common": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz",
- "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-util": "9.0.4"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-ethash": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz",
- "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-block": "5.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "bigint-crypto-utils": "^3.2.2",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-evm": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz",
- "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-statemanager": "2.0.4",
- "@nomicfoundation/ethereumjs-tx": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "@types/debug": "^4.1.9",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "rustbn-wasm": "^0.2.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-rlp": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz",
- "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==",
- "dev": true,
- "bin": {
- "rlp": "bin/rlp.cjs"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-statemanager": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz",
- "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-trie": "6.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3",
- "js-sdsl": "^4.1.4",
- "lru-cache": "^10.0.0"
- },
- "peerDependencies": {
- "@nomicfoundation/ethereumjs-verkle": "0.0.2"
- },
- "peerDependenciesMeta": {
- "@nomicfoundation/ethereumjs-verkle": {
- "optional": true
- }
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-trie": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz",
- "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "@types/readable-stream": "^2.3.13",
- "ethereum-cryptography": "0.1.3",
- "lru-cache": "^10.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-tx": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz",
- "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "c-kzg": "^2.1.2"
- },
- "peerDependenciesMeta": {
- "c-kzg": {
- "optional": true
- }
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-util": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz",
- "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "c-kzg": "^2.1.2"
- },
- "peerDependenciesMeta": {
- "c-kzg": {
- "optional": true
- }
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-verkle": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz",
- "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "lru-cache": "^10.0.0",
- "rust-verkle-wasm": "^0.0.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-verkle/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@nomicfoundation/ethereumjs-vm": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz",
- "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==",
- "dev": true,
- "dependencies": {
- "@nomicfoundation/ethereumjs-block": "5.0.4",
- "@nomicfoundation/ethereumjs-blockchain": "7.0.4",
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-evm": "2.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-statemanager": "2.0.4",
- "@nomicfoundation/ethereumjs-trie": "6.0.4",
- "@nomicfoundation/ethereumjs-tx": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "debug": "^4.3.3",
- "ethereum-cryptography": "0.1.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@nomicfoundation/hardhat-chai-matchers": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz",
- "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/chai-as-promised": "^7.1.3",
- "chai-as-promised": "^7.1.1",
- "deep-eql": "^4.0.1",
- "ordinal": "^1.0.3"
- },
- "peerDependencies": {
- "@nomicfoundation/hardhat-ethers": "^3.0.0",
- "chai": "^4.2.0",
- "ethers": "^6.1.0",
- "hardhat": "^2.9.4"
- }
- },
- "node_modules/@nomicfoundation/hardhat-ethers": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz",
- "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^4.1.1",
- "lodash.isequal": "^4.5.0"
- },
- "peerDependencies": {
- "ethers": "^6.1.0",
- "hardhat": "^2.0.0"
- }
- },
- "node_modules/@nomicfoundation/hardhat-network-helpers": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz",
- "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ethereumjs-util": "^7.1.4"
- },
- "peerDependencies": {
- "hardhat": "^2.9.5"
- }
- },
- "node_modules/@nomicfoundation/hardhat-toolbox": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz",
- "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==",
- "dev": true,
- "peerDependencies": {
- "@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
- "@nomicfoundation/hardhat-ethers": "^3.0.0",
- "@nomicfoundation/hardhat-network-helpers": "^1.0.0",
- "@nomicfoundation/hardhat-verify": "^1.0.0",
- "@typechain/ethers-v6": "^0.4.0",
- "@typechain/hardhat": "^8.0.0",
- "@types/chai": "^4.2.0",
- "@types/mocha": ">=9.1.0",
- "@types/node": ">=12.0.0",
- "chai": "^4.2.0",
- "ethers": "^6.4.0",
- "hardhat": "^2.11.0",
- "hardhat-gas-reporter": "^1.0.8",
- "solidity-coverage": "^0.8.1",
- "ts-node": ">=8.0.0",
- "typechain": "^8.2.0",
- "typescript": ">=4.5.0"
- }
- },
- "node_modules/@nomicfoundation/hardhat-verify": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz",
- "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@ethersproject/abi": "^5.1.2",
- "@ethersproject/address": "^5.0.2",
- "cbor": "^8.1.0",
- "chalk": "^2.4.2",
- "debug": "^4.1.1",
- "lodash.clonedeep": "^4.5.0",
- "semver": "^6.3.0",
- "table": "^6.8.0",
- "undici": "^5.14.0"
- },
- "peerDependencies": {
- "hardhat": "^2.0.4"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz",
- "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==",
- "dev": true,
- "engines": {
- "node": ">= 12"
- },
- "optionalDependencies": {
- "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1",
- "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1",
- "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1",
- "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1",
- "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1",
- "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1",
- "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1",
- "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1",
- "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1",
- "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz",
- "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz",
- "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz",
- "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz",
- "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz",
- "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz",
- "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz",
- "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz",
- "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz",
- "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz",
- "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@oclif/command": {
- "version": "1.8.36",
- "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz",
- "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "@oclif/config": "^1.18.2",
- "@oclif/errors": "^1.3.6",
- "@oclif/help": "^1.0.1",
- "@oclif/parser": "^3.8.17",
- "debug": "^4.1.1",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@oclif/config": "^1"
- }
- },
- "node_modules/@oclif/command/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@oclif/command/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@oclif/command/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/@oclif/config": {
- "version": "1.18.17",
- "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz",
- "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "@oclif/errors": "^1.3.6",
- "@oclif/parser": "^3.8.17",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-wsl": "^2.1.1",
- "tslib": "^2.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@oclif/config/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/config/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/config/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@oclif/core": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.15.0.tgz",
- "integrity": "sha512-fNEMG5DzJHhYmI3MgpByTvltBOMyFcnRIUMxbiz2ai8rhaYgaTHMG3Q38HcosfIvtw9nCjxpcQtC8MN8QtVCcA==",
- "dev": true,
- "dependencies": {
- "@types/cli-progress": "^3.11.0",
- "ansi-escapes": "^4.3.2",
- "ansi-styles": "^4.3.0",
- "cardinal": "^2.1.1",
- "chalk": "^4.1.2",
- "clean-stack": "^3.0.1",
- "cli-progress": "^3.12.0",
- "debug": "^4.3.4",
- "ejs": "^3.1.8",
- "get-package-type": "^0.1.0",
- "globby": "^11.1.0",
- "hyperlinker": "^1.0.0",
- "indent-string": "^4.0.0",
- "is-wsl": "^2.2.0",
- "js-yaml": "^3.14.1",
- "natural-orderby": "^2.0.3",
- "object-treeify": "^1.1.33",
- "password-prompt": "^1.1.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "supports-color": "^8.1.1",
- "supports-hyperlinks": "^2.2.0",
- "ts-node": "^10.9.1",
- "tslib": "^2.5.0",
- "widest-line": "^3.1.0",
- "wordwrap": "^1.0.0",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@oclif/core/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@oclif/core/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/@oclif/core/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/core/node_modules/clean-stack": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz",
- "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/core/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@oclif/core/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@oclif/core/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/core/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@oclif/core/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/core/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/core/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/@oclif/core/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/core/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/core/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/@oclif/core/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@oclif/errors": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz",
- "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "clean-stack": "^3.0.0",
- "fs-extra": "^8.1",
- "indent-string": "^4.0.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@oclif/errors/node_modules/clean-stack": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz",
- "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/errors/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/errors/node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/@oclif/errors/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@oclif/errors/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/@oclif/help": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz",
- "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "@oclif/config": "1.18.16",
- "@oclif/errors": "1.3.6",
- "chalk": "^4.1.2",
- "indent-string": "^4.0.0",
- "lodash": "^4.17.21",
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "widest-line": "^3.1.0",
- "wrap-ansi": "^6.2.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@oclif/help/node_modules/@oclif/config": {
- "version": "1.18.16",
- "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz",
- "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "@oclif/errors": "^1.3.6",
- "@oclif/parser": "^3.8.16",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-wsl": "^2.1.1",
- "tslib": "^2.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@oclif/help/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@oclif/help/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@oclif/help/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@oclif/help/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@oclif/help/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@oclif/help/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/help/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/help/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/help/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/help/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@oclif/help/node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/linewrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz",
- "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==",
- "dev": true
- },
- "node_modules/@oclif/parser": {
- "version": "3.8.17",
- "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz",
- "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "dependencies": {
- "@oclif/errors": "^1.3.6",
- "@oclif/linewrap": "^1.0.0",
- "chalk": "^4.1.0",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@oclif/parser/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@oclif/parser/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@oclif/parser/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@oclif/parser/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@oclif/parser/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/parser/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@oclif/parser/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@oclif/plugin-help": {
- "version": "5.2.20",
- "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz",
- "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==",
- "dev": true,
- "dependencies": {
- "@oclif/core": "^2.15.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@openzeppelin/contracts": {
- "version": "4.8.2",
- "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz",
- "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==",
- "dev": true
- },
- "node_modules/@openzeppelin/contracts-upgradeable": {
- "version": "4.8.2",
- "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz",
- "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==",
- "dev": true
- },
- "node_modules/@openzeppelin/contracts5": {
- "name": "@openzeppelin/contracts",
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.0.tgz",
- "integrity": "sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw==",
- "dev": true
- },
- "node_modules/@openzeppelin/defender-admin-client": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.1.tgz",
- "integrity": "sha512-kRpSUdTsnSqntp4FOXIm95t+6VKHc8CUY2Si71VDuxs0q7HSPZkdpRPSntcolwEzWy9L4a8NS/QMwDF5NJ4X1g==",
- "dev": true,
- "dependencies": {
- "@openzeppelin/defender-base-client": "1.54.1",
- "axios": "^1.4.0",
- "ethers": "^5.7.2",
- "lodash": "^4.17.19",
- "node-fetch": "^2.6.0"
- }
- },
- "node_modules/@openzeppelin/defender-admin-client/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@openzeppelin/defender-base-client": {
- "version": "1.54.1",
- "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.1.tgz",
- "integrity": "sha512-DRGz/7KN3ZQwu28YWMOaojrC7jjPkz/uCwkC8/C8B11qwZhA5qIVvyhYHhhFOCl0J84+E3TNdvkPD2q3p2WaJw==",
- "dev": true,
- "dependencies": {
- "amazon-cognito-identity-js": "^6.0.1",
- "async-retry": "^1.3.3",
- "axios": "^1.4.0",
- "lodash": "^4.17.19",
- "node-fetch": "^2.6.0"
- }
- },
- "node_modules/@openzeppelin/defender-sdk-base-client": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.7.0.tgz",
- "integrity": "sha512-tNT/uaAS37I+EZUVcH6AyM6gfvxiiBQ+tdY8Jk73XKtEdiYd0pJnKyaeeUHIlvKCNS/wyxX6hlPVjeC4hy59Nw==",
- "dev": true,
- "dependencies": {
- "amazon-cognito-identity-js": "^6.3.6",
- "async-retry": "^1.3.3"
- }
- },
- "node_modules/@openzeppelin/defender-sdk-deploy-client": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.7.0.tgz",
- "integrity": "sha512-eu/1khO5R0IdHio3BXlzUWZdr0Rgodoi49Djqtl3N78G8yN7t4RijfGrJm9rSqjrDFsjM41eWNHYGjc+KKyhKg==",
- "dev": true,
- "dependencies": {
- "@ethersproject/abi": "^5.7.0",
- "@openzeppelin/defender-sdk-base-client": "^1.7.0",
- "axios": "^1.4.0",
- "lodash": "^4.17.21"
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.5.0.tgz",
- "integrity": "sha512-pRsqyRbp8LX9sTSMbL7jx4NjqjN/4PlKngmuAyRQIheYTGbRIs3FW3WyLuiCjkDlTETfmOsmzrnZxJmxDmxZIA==",
- "dev": true,
- "dependencies": {
- "@openzeppelin/defender-admin-client": "^1.52.0",
- "@openzeppelin/defender-base-client": "^1.52.0",
- "@openzeppelin/defender-sdk-base-client": "^1.5.0",
- "@openzeppelin/defender-sdk-deploy-client": "^1.5.0",
- "@openzeppelin/upgrades-core": "^1.31.2",
- "chalk": "^4.1.0",
- "debug": "^4.1.1",
- "ethereumjs-util": "^7.1.5",
- "proper-lockfile": "^4.1.1",
- "undici": "^5.14.0"
- },
- "bin": {
- "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js"
- },
- "peerDependencies": {
- "@nomicfoundation/hardhat-ethers": "^3.0.0",
- "@nomicfoundation/hardhat-verify": "^1.1.0",
- "ethers": "^6.6.0",
- "hardhat": "^2.0.2"
- },
- "peerDependenciesMeta": {
- "@nomicfoundation/hardhat-verify": {
- "optional": true
- }
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@openzeppelin/hardhat-upgrades/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@openzeppelin/upgrades-core": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.32.0.tgz",
- "integrity": "sha512-ZjYB5Ks5Haz8yzJDd9VzTtJyqm746+WYFOi8jeVljyGxC4Xm2wuizf/n1lw0CmCw9seNhD1J1tA4fA6ScXYPDg==",
- "dev": true,
- "dependencies": {
- "cbor": "^9.0.0",
- "chalk": "^4.1.0",
- "compare-versions": "^6.0.0",
- "debug": "^4.1.1",
- "ethereumjs-util": "^7.0.3",
- "minimist": "^1.2.7",
- "proper-lockfile": "^4.1.1",
- "solidity-ast": "^0.4.51"
- },
- "bin": {
- "openzeppelin-upgrades-core": "dist/cli/cli.js"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz",
- "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==",
- "dev": true,
- "dependencies": {
- "nofilter": "^3.1.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@polygon-hermez/common": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/@polygon-hermez/common/-/common-2.6.4.tgz",
- "integrity": "sha512-ZGl/K1MaXHaDagqKCqkQgCRu9EfJ+mbK+t4GeVnDywMYGCyi7jF1u71Pyh4Rch3XFd/8rW/eVL4x4jkGwN16JQ==",
- "dev": true,
- "dependencies": {
- "crc-32": "^1.2.0",
- "ethereumjs-util": "^7.1.4"
- }
- },
- "node_modules/@polygon-hermez/vm": {
- "version": "5.7.36",
- "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.36.tgz",
- "integrity": "sha512-BN/42g7NbQZYz1+f2uEaVvZOxf1eCjFKkT/mTCdTK5ARpxDOzBwIVnt3WTjzgUsj7BzDU4btB0ifPNaKKR2Dpw==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/block": "^3.6.1",
- "@ethereumjs/blockchain": "^5.5.1",
- "@ethereumjs/common": "^2.6.2",
- "@ethereumjs/tx": "^3.5.0",
- "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v1.0.0",
- "async-eventemitter": "^0.2.4",
- "core-js-pure": "^3.0.1",
- "debug": "^4.3.3",
- "ethereumjs-util": "^7.1.4",
- "ethers": "^5.6.2",
- "functional-red-black-tree": "^1.0.1",
- "lodash": "^4.17.21",
- "mcl-wasm": "^0.7.1",
- "merkle-patricia-tree": "^4.2.3",
- "rustbn.js": "~0.2.0"
- }
- },
- "node_modules/@polygon-hermez/vm/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@polygon-hermez/zkevm-commonjs": {
- "name": "@0xpolygonhermez/zkevm-commonjs",
- "version": "1.0.0",
- "resolved": "git+ssh://git@github.com/hermeznetwork/zkevm-commonjs.git#34f72fe9f7a4c3c45965742476a87148c9e05c0f",
- "dev": true,
- "license": "pending",
- "dependencies": {
- "@ethereumjs/block": "^3.6.2",
- "@ethereumjs/tx": "^3.4.0",
- "@polygon-hermez/common": "2.6.4",
- "@polygon-hermez/vm": "5.7.30",
- "ethereumjs-util": "^7.1.4",
- "ethers": "^5.5.4",
- "ffjavascript": "^0.2.55",
- "lodash": "^4.17.21",
- "pg": "^8.7.1"
- }
- },
- "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/@polygon-hermez/vm": {
- "version": "5.7.30",
- "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-5.7.30.tgz",
- "integrity": "sha512-HxmrGuRpYsgwd4rnvYNQ4OR77OKdAbUsAD1Z6PoEvV18NHsMv6JGpMnvnSAseiCBCyqTHjnFqWynoQ1nl0Qr6g==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/block": "^3.6.1",
- "@ethereumjs/blockchain": "^5.5.1",
- "@ethereumjs/common": "^2.6.2",
- "@ethereumjs/tx": "^3.5.0",
- "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v0.5.0.1",
- "async-eventemitter": "^0.2.4",
- "core-js-pure": "^3.0.1",
- "debug": "^4.3.3",
- "ethereumjs-util": "^7.1.4",
- "ethers": "^5.6.2",
- "functional-red-black-tree": "^1.0.1",
- "lodash": "^4.17.21",
- "mcl-wasm": "^0.7.1",
- "merkle-patricia-tree": "^4.2.3",
- "rustbn.js": "~0.2.0"
- }
- },
- "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/@resolver-engine/core": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz",
- "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==",
- "dev": true,
- "dependencies": {
- "debug": "^3.1.0",
- "is-url": "^1.2.4",
- "request": "^2.85.0"
- }
- },
- "node_modules/@resolver-engine/core/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/@resolver-engine/fs": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz",
- "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==",
- "dev": true,
- "dependencies": {
- "@resolver-engine/core": "^0.3.3",
- "debug": "^3.1.0"
- }
- },
- "node_modules/@resolver-engine/fs/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/@resolver-engine/imports": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz",
- "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==",
- "dev": true,
- "dependencies": {
- "@resolver-engine/core": "^0.3.3",
- "debug": "^3.1.0",
- "hosted-git-info": "^2.6.0",
- "path-browserify": "^1.0.0",
- "url": "^0.11.0"
- }
- },
- "node_modules/@resolver-engine/imports-fs": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz",
- "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==",
- "dev": true,
- "dependencies": {
- "@resolver-engine/fs": "^0.3.3",
- "@resolver-engine/imports": "^0.3.3",
- "debug": "^3.1.0"
- }
- },
- "node_modules/@resolver-engine/imports-fs/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/@resolver-engine/imports/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/@scure/base": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz",
- "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==",
- "dev": true,
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/bip32": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz",
- "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==",
- "dev": true,
- "dependencies": {
- "@noble/curves": "~1.1.0",
- "@noble/hashes": "~1.3.1",
- "@scure/base": "~1.1.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/bip32/node_modules/@noble/curves": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz",
- "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "1.3.1"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/bip32/node_modules/@noble/hashes": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz",
- "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
- "dev": true,
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/bip39": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz",
- "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "~1.3.0",
- "@scure/base": "~1.1.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@sentry/core": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz",
- "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==",
- "dev": true,
- "dependencies": {
- "@sentry/hub": "5.30.0",
- "@sentry/minimal": "5.30.0",
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/hub": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz",
- "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==",
- "dev": true,
- "dependencies": {
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/minimal": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz",
- "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==",
- "dev": true,
- "dependencies": {
- "@sentry/hub": "5.30.0",
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/node": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz",
- "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==",
- "dev": true,
- "dependencies": {
- "@sentry/core": "5.30.0",
- "@sentry/hub": "5.30.0",
- "@sentry/tracing": "5.30.0",
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "cookie": "^0.4.1",
- "https-proxy-agent": "^5.0.0",
- "lru_map": "^0.3.3",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/tracing": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz",
- "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==",
- "dev": true,
- "dependencies": {
- "@sentry/hub": "5.30.0",
- "@sentry/minimal": "5.30.0",
- "@sentry/types": "5.30.0",
- "@sentry/utils": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/types": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz",
- "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@sentry/utils": {
- "version": "5.30.0",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz",
- "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==",
- "dev": true,
- "dependencies": {
- "@sentry/types": "5.30.0",
- "tslib": "^1.9.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@smithy/types": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.7.0.tgz",
- "integrity": "sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@smithy/types/node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "dev": true
- },
- "node_modules/@solidity-parser/parser": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz",
- "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "node_modules/@tsconfig/node10": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
- "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
- "dev": true
- },
- "node_modules/@tsconfig/node12": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
- "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
- "dev": true
- },
- "node_modules/@tsconfig/node14": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
- "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
- "dev": true
- },
- "node_modules/@tsconfig/node16": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
- "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
- "dev": true
- },
- "node_modules/@typechain/ethers-v6": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz",
- "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.15",
- "ts-essentials": "^7.0.1"
- },
- "peerDependencies": {
- "ethers": "6.x",
- "typechain": "^8.3.1",
- "typescript": ">=4.7.0"
- }
- },
- "node_modules/@typechain/hardhat": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz",
- "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fs-extra": "^9.1.0"
- },
- "peerDependencies": {
- "@typechain/ethers-v6": "^0.4.3",
- "ethers": "^6.1.0",
- "hardhat": "^2.9.9",
- "typechain": "^8.3.1"
- }
- },
- "node_modules/@types/abstract-leveldown": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz",
- "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==",
- "dev": true
- },
- "node_modules/@types/bn.js": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz",
- "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/chai": {
- "version": "4.3.8",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz",
- "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/chai-as-promised": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz",
- "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/chai": "*"
- }
- },
- "node_modules/@types/cli-progress": {
- "version": "3.11.3",
- "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.3.tgz",
- "integrity": "sha512-/+C9xAdVtc+g5yHHkGBThgAA8rYpi5B+2ve3wLtybYj0JHEBs57ivR4x/zGfSsplRnV+psE91Nfin1soNKqz5Q==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/concat-stream": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
- "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "dev": true,
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/form-data": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
- "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/level-errors": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz",
- "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==",
- "dev": true
- },
- "node_modules/@types/levelup": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz",
- "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==",
- "dev": true,
- "dependencies": {
- "@types/abstract-leveldown": "*",
- "@types/level-errors": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==",
- "dev": true
- },
- "node_modules/@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/mkdirp": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz",
- "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/mocha": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz",
- "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
- "dev": true
- },
- "node_modules/@types/node": {
- "version": "20.8.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz",
- "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==",
- "dev": true,
- "dependencies": {
- "undici-types": "~5.25.1"
- }
- },
- "node_modules/@types/node-fetch": {
- "version": "2.6.6",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz",
- "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "form-data": "^4.0.0"
- }
- },
- "node_modules/@types/pbkdf2": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz",
- "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/prettier": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
- "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
- "dev": true
- },
- "node_modules/@types/qs": {
- "version": "6.9.8",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz",
- "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/readable-stream": {
- "version": "2.3.15",
- "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz",
- "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/@types/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/@types/resolve": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
- "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/secp256k1": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz",
- "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/yargs": {
- "version": "17.0.28",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz",
- "integrity": "sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==",
- "dev": true,
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.1",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz",
- "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==",
- "dev": true
- },
- "node_modules/@yarnpkg/lockfile": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
- "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
- "dev": true
- },
- "node_modules/abbrev": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
- "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/abstract-leveldown": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz",
- "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==",
- "dev": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "immediate": "^3.2.3",
- "level-concat-iterator": "~2.0.0",
- "level-supports": "~1.0.0",
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/abstract-leveldown/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/abstract-leveldown/node_modules/level-supports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
- "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/adm-zip": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
- "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
- "dev": true,
- "engines": {
- "node": ">=0.3.0"
- }
- },
- "node_modules/aes-js": {
- "version": "4.0.0-beta.5",
- "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
- "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/amazon-cognito-identity-js": {
- "version": "6.3.7",
- "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.7.tgz",
- "integrity": "sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==",
- "dev": true,
- "dependencies": {
- "@aws-crypto/sha256-js": "1.2.2",
- "buffer": "4.9.2",
- "fast-base64-decode": "^1.0.0",
- "isomorphic-unfetch": "^3.0.0",
- "js-cookie": "^2.2.1"
- }
- },
- "node_modules/amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=0.4.2"
- }
- },
- "node_modules/ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.1.0"
- }
- },
- "node_modules/ansi-align/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-colors": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
- "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-escapes/node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansicolors": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
- "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
- "dev": true
- },
- "node_modules/antlr4ts": {
- "version": "0.5.0-alpha.4",
- "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz",
- "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==",
- "dev": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-array-buffer": "^3.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array.prototype.findlast": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz",
- "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
- "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
- "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-array-buffer": "^3.0.2",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
- "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
- "dev": true,
- "dependencies": {
- "lodash": "^4.17.14"
- }
- },
- "node_modules/async-eventemitter": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz",
- "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==",
- "dev": true,
- "dependencies": {
- "async": "^2.4.0"
- }
- },
- "node_modules/async-retry": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
- "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
- "dev": true,
- "dependencies": {
- "retry": "0.13.1"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
- },
- "node_modules/axios": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
- "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
- "dev": true,
- "dependencies": {
- "follow-redirects": "^1.15.0",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/b4a": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
- "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==",
- "dev": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base-x": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz",
- "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
- "node_modules/bech32": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
- "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
- "dev": true
- },
- "node_modules/bigint-crypto-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz",
- "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==",
- "dev": true,
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/blake-hash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz",
- "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "node-addon-api": "^3.0.0",
- "node-gyp-build": "^4.2.2",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/blake2b": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz",
- "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==",
- "dev": true,
- "dependencies": {
- "blake2b-wasm": "^2.4.0",
- "nanoassert": "^2.0.0"
- }
- },
- "node_modules/blake2b-wasm": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz",
- "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==",
- "dev": true,
- "dependencies": {
- "b4a": "^1.0.1",
- "nanoassert": "^2.0.0"
- }
- },
- "node_modules/blakejs": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
- "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==",
- "dev": true
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
- "node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/boxen": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
- "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
- "dev": true,
- "dependencies": {
- "ansi-align": "^3.0.0",
- "camelcase": "^6.2.0",
- "chalk": "^4.1.0",
- "cli-boxes": "^2.2.1",
- "string-width": "^4.2.2",
- "type-fest": "^0.20.2",
- "widest-line": "^3.1.0",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/boxen/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/boxen/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/boxen/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "node_modules/browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "dependencies": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/browserify-aes/node_modules/buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "node_modules/bs58": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
- "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
- "dev": true,
- "dependencies": {
- "base-x": "^3.0.2"
- }
- },
- "node_modules/bs58check": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
- "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
- "dev": true,
- "dependencies": {
- "bs58": "^4.0.0",
- "create-hash": "^1.1.0",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "dev": true,
- "dependencies": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/buffer-writer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
- "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/buffer-xor": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz",
- "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cardinal": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
- "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
- "dev": true,
- "dependencies": {
- "ansicolors": "~0.3.2",
- "redeyed": "~2.1.0"
- },
- "bin": {
- "cdl": "bin/cdl.js"
- }
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
- "node_modules/cbor": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz",
- "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "nofilter": "^3.1.0"
- },
- "engines": {
- "node": ">=12.19"
- }
- },
- "node_modules/chai": {
- "version": "4.3.10",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz",
- "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "check-error": "^1.0.2"
- },
- "peerDependencies": {
- "chai": ">= 2.1.2 < 5"
- }
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "node_modules/cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/circomlibjs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.1.tgz",
- "integrity": "sha512-Bl7Mylf/VERdI5bRTIQ4hpi2EgbfIvEyJrn/MPh2pEqScbCkatX44RF8fuNGigoiQGdhItaIikgHKLTdlPPLPQ==",
- "dev": true,
- "dependencies": {
- "blake-hash": "^2.0.0",
- "blake2b": "^2.1.3",
- "ethers": "^5.5.1",
- "ffjavascript": "^0.2.45"
- }
- },
- "node_modules/circomlibjs/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-progress": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
- "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.3"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cli-progress/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
- },
- "engines": {
- "node": ">=6"
- },
- "optionalDependencies": {
- "colors": "^1.1.2"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/cliui/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/command-exists": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
- "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "dev": true
- },
- "node_modules/command-line-args": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
- "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^3.1.0",
- "find-replace": "^3.0.0",
- "lodash.camelcase": "^4.3.0",
- "typical": "^4.0.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/command-line-usage": {
- "version": "6.1.3",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
- "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^4.0.2",
- "chalk": "^2.4.2",
- "table-layout": "^1.0.2",
- "typical": "^5.2.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/command-line-usage/node_modules/array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/command-line-usage/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/commander": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
- "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
- "dev": true
- },
- "node_modules/compare-versions": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz",
- "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==",
- "dev": true
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "engines": [
- "node >= 0.8"
- ],
- "peer": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/concat-stream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/concat-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "peer": true
- },
- "node_modules/concat-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/confusing-browser-globals": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
- "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
- "dev": true
- },
- "node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/core-js-pure": {
- "version": "3.33.0",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz",
- "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==",
- "dev": true,
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true
- },
- "node_modules/crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "dev": true,
- "bin": {
- "crc32": "bin/crc32.njs"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "node_modules/create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/death": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
- "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==",
- "dev": true,
- "peer": true
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/deferred-leveldown": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
- "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
- "dev": true,
- "dependencies": {
- "abstract-leveldown": "~6.2.1",
- "inherits": "^2.0.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/deferred-leveldown/node_modules/abstract-leveldown": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
- "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
- "dev": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "immediate": "^3.2.3",
- "level-concat-iterator": "~2.0.0",
- "level-supports": "~1.0.0",
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/deferred-leveldown/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/deferred-leveldown/node_modules/level-supports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
- "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/detect-port": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
- "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "address": "^1.0.1",
- "debug": "4"
- },
- "bin": {
- "detect": "bin/detect-port.js",
- "detect-port": "bin/detect-port.js"
- }
- },
- "node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/difflib": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz",
- "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "heap": ">= 0.2.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/dotenv": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
- "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ejs": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
- "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
- "dev": true,
- "dependencies": {
- "jake": "^10.8.5"
- },
- "bin": {
- "ejs": "bin/cli.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/elliptic/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/encoding-down": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
- "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
- "dev": true,
- "dependencies": {
- "abstract-leveldown": "^6.2.1",
- "inherits": "^2.0.3",
- "level-codec": "^9.0.0",
- "level-errors": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/enquirer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
- "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
- "dev": true,
- "dependencies": {
- "ansi-colors": "^4.1.1",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/errno": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
- "dev": true,
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz",
- "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "arraybuffer.prototype.slice": "^1.0.2",
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.1",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "is-array-buffer": "^3.0.2",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.12",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.3",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "safe-array-concat": "^1.0.1",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trim": "^1.2.8",
- "string.prototype.trimend": "^1.0.7",
- "string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.0",
- "typed-array-byte-length": "^1.0.0",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.11"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/escodegen": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
- "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "esprima": "^2.7.1",
- "estraverse": "^1.9.1",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=0.12.0"
- },
- "optionalDependencies": {
- "source-map": "~0.2.0"
- }
- },
- "node_modules/escodegen/node_modules/estraverse": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
- "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/escodegen/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.51.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz",
- "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.51.0",
- "@humanwhocodes/config-array": "^0.11.11",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-airbnb-base": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
- "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
- "dev": true,
- "dependencies": {
- "confusing-browser-globals": "^1.0.10",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.5",
- "semver": "^6.3.0"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "peerDependencies": {
- "eslint": "^7.32.0 || ^8.2.0",
- "eslint-plugin-import": "^2.25.2"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
- "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.28.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
- "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.findlastindex": "^1.2.2",
- "array.prototype.flat": "^1.3.1",
- "array.prototype.flatmap": "^1.3.1",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.7",
- "eslint-module-utils": "^2.8.0",
- "has": "^1.0.3",
- "is-core-module": "^2.13.0",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.6",
- "object.groupby": "^1.0.0",
- "object.values": "^1.1.6",
- "semver": "^6.3.1",
- "tsconfig-paths": "^3.14.2"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-mocha": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz",
- "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==",
- "dev": true,
- "dependencies": {
- "eslint-utils": "^3.0.0",
- "ramda": "^0.27.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
- }
- },
- "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esprima": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
- "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
- "dev": true,
- "peer": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eth-ens-namehash": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
- "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==",
- "dev": true,
- "dependencies": {
- "idna-uts46-hx": "^2.3.1",
- "js-sha3": "^0.5.7"
- }
- },
- "node_modules/eth-ens-namehash/node_modules/js-sha3": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
- "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==",
- "dev": true
- },
- "node_modules/eth-gas-reporter": {
- "version": "0.2.27",
- "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz",
- "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@solidity-parser/parser": "^0.14.0",
- "axios": "^1.5.1",
- "cli-table3": "^0.5.0",
- "colors": "1.4.0",
- "ethereum-cryptography": "^1.0.3",
- "ethers": "^5.7.2",
- "fs-readdir-recursive": "^1.1.0",
- "lodash": "^4.17.14",
- "markdown-table": "^1.1.3",
- "mocha": "^10.2.0",
- "req-cwd": "^2.0.0",
- "sha1": "^1.1.1",
- "sync-request": "^6.0.0"
- },
- "peerDependencies": {
- "@codechecks/client": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "@codechecks/client": {
- "optional": true
- }
- }
- },
- "node_modules/eth-gas-reporter/node_modules/@noble/hashes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz",
- "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "peer": true
- },
- "node_modules/eth-gas-reporter/node_modules/@scure/bip32": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz",
- "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "peer": true,
- "dependencies": {
- "@noble/hashes": "~1.2.0",
- "@noble/secp256k1": "~1.7.0",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/@scure/bip39": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz",
- "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "peer": true,
- "dependencies": {
- "@noble/hashes": "~1.2.0",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
- "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@noble/hashes": "1.2.0",
- "@noble/secp256k1": "1.7.1",
- "@scure/bip32": "1.1.5",
- "@scure/bip39": "1.1.1"
- }
- },
- "node_modules/eth-gas-reporter/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/ethereum-bloom-filters": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz",
- "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==",
- "dev": true,
- "dependencies": {
- "js-sha3": "^0.8.0"
- }
- },
- "node_modules/ethereum-cryptography": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
- "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
- "dev": true,
- "dependencies": {
- "@types/pbkdf2": "^3.0.0",
- "@types/secp256k1": "^4.0.1",
- "blakejs": "^1.1.0",
- "browserify-aes": "^1.2.0",
- "bs58check": "^2.1.2",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "hash.js": "^1.1.7",
- "keccak": "^3.0.0",
- "pbkdf2": "^3.0.17",
- "randombytes": "^2.1.0",
- "safe-buffer": "^5.1.2",
- "scrypt-js": "^3.0.0",
- "secp256k1": "^4.0.1",
- "setimmediate": "^1.0.5"
- }
- },
- "node_modules/ethereum-waffle": {
- "version": "3.4.4",
- "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz",
- "integrity": "sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==",
- "dev": true,
- "dependencies": {
- "@ethereum-waffle/chai": "^3.4.4",
- "@ethereum-waffle/compiler": "^3.4.4",
- "@ethereum-waffle/mock-contract": "^3.4.4",
- "@ethereum-waffle/provider": "^3.4.4",
- "ethers": "^5.0.1"
- },
- "bin": {
- "waffle": "bin/waffle"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/ethereum-waffle/node_modules/ethers": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
- "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "dependencies": {
- "@ethersproject/abi": "5.7.0",
- "@ethersproject/abstract-provider": "5.7.0",
- "@ethersproject/abstract-signer": "5.7.0",
- "@ethersproject/address": "5.7.0",
- "@ethersproject/base64": "5.7.0",
- "@ethersproject/basex": "5.7.0",
- "@ethersproject/bignumber": "5.7.0",
- "@ethersproject/bytes": "5.7.0",
- "@ethersproject/constants": "5.7.0",
- "@ethersproject/contracts": "5.7.0",
- "@ethersproject/hash": "5.7.0",
- "@ethersproject/hdnode": "5.7.0",
- "@ethersproject/json-wallets": "5.7.0",
- "@ethersproject/keccak256": "5.7.0",
- "@ethersproject/logger": "5.7.0",
- "@ethersproject/networks": "5.7.1",
- "@ethersproject/pbkdf2": "5.7.0",
- "@ethersproject/properties": "5.7.0",
- "@ethersproject/providers": "5.7.2",
- "@ethersproject/random": "5.7.0",
- "@ethersproject/rlp": "5.7.0",
- "@ethersproject/sha2": "5.7.0",
- "@ethersproject/signing-key": "5.7.0",
- "@ethersproject/solidity": "5.7.0",
- "@ethersproject/strings": "5.7.0",
- "@ethersproject/transactions": "5.7.0",
- "@ethersproject/units": "5.7.0",
- "@ethersproject/wallet": "5.7.0",
- "@ethersproject/web": "5.7.1",
- "@ethersproject/wordlists": "5.7.0"
- }
- },
- "node_modules/ethereumjs-abi": {
- "version": "0.6.8",
- "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
- "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.11.8",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ethereumjs-abi/node_modules/@types/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/ethereumjs-abi/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
- "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
- "dev": true,
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/ethereumjs-util": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
- "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
- "dev": true,
- "dependencies": {
- "@types/bn.js": "^5.1.0",
- "bn.js": "^5.1.2",
- "create-hash": "^1.1.2",
- "ethereum-cryptography": "^0.1.3",
- "rlp": "^2.2.4"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/ethers": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.0.tgz",
- "integrity": "sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/ethers-io/"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "peer": true,
- "dependencies": {
- "@adraffy/ens-normalize": "1.10.0",
- "@noble/curves": "1.2.0",
- "@noble/hashes": "1.3.2",
- "@types/node": "18.15.13",
- "aes-js": "4.0.0-beta.5",
- "tslib": "2.4.0",
- "ws": "8.5.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/ethers/node_modules/@types/node": {
- "version": "18.15.13",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz",
- "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/ethers/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/ethjs-unit": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
- "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
- "dev": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "number-to-bn": "1.7.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ethjs-unit/node_modules/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- },
- "node_modules/ethjs-util": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
- "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
- "dev": true,
- "dependencies": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "dependencies": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
- "node_modules/fast-base64-decode": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz",
- "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==",
- "dev": true
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/ffjavascript": {
- "version": "0.2.60",
- "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz",
- "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==",
- "dev": true,
- "dependencies": {
- "wasmbuilder": "0.0.16",
- "wasmcurves": "0.2.2",
- "web-worker": "^1.2.0"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "dev": true,
- "dependencies": {
- "minimatch": "^5.0.1"
- }
- },
- "node_modules/filelist/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^3.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/find-yarn-workspace-root": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
- "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
- "dev": true,
- "dependencies": {
- "micromatch": "^4.0.2"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
- "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
- "dev": true
- },
- "node_modules/follow-redirects": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
- "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fp-ts": {
- "version": "1.19.3",
- "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz",
- "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==",
- "dev": true
- },
- "node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true,
- "peer": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
- "dev": true
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core": {
- "version": "2.13.2",
- "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz",
- "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==",
- "bundleDependencies": [
- "keccak"
- ],
- "deprecated": "ganache-core is now ganache; visit https://trfl.io/g7 for details",
- "dev": true,
- "hasShrinkwrap": true,
- "dependencies": {
- "abstract-leveldown": "3.0.0",
- "async": "2.6.2",
- "bip39": "2.5.0",
- "cachedown": "1.0.0",
- "clone": "2.1.2",
- "debug": "3.2.6",
- "encoding-down": "5.0.4",
- "eth-sig-util": "3.0.0",
- "ethereumjs-abi": "0.6.8",
- "ethereumjs-account": "3.0.0",
- "ethereumjs-block": "2.2.2",
- "ethereumjs-common": "1.5.0",
- "ethereumjs-tx": "2.1.2",
- "ethereumjs-util": "6.2.1",
- "ethereumjs-vm": "4.2.0",
- "heap": "0.2.6",
- "keccak": "3.0.1",
- "level-sublevel": "6.6.4",
- "levelup": "3.1.1",
- "lodash": "4.17.20",
- "lru-cache": "5.1.1",
- "merkle-patricia-tree": "3.0.0",
- "patch-package": "6.2.2",
- "seedrandom": "3.0.1",
- "source-map-support": "0.5.12",
- "tmp": "0.1.0",
- "web3-provider-engine": "14.2.1",
- "websocket": "1.0.32"
- },
- "engines": {
- "node": ">=8.9.0"
- },
- "optionalDependencies": {
- "ethereumjs-wallet": "0.6.5",
- "web3": "1.2.11"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/abi": {
- "version": "5.0.0-beta.153",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/address": ">=5.0.0-beta.128",
- "@ethersproject/bignumber": ">=5.0.0-beta.130",
- "@ethersproject/bytes": ">=5.0.0-beta.129",
- "@ethersproject/constants": ">=5.0.0-beta.128",
- "@ethersproject/hash": ">=5.0.0-beta.128",
- "@ethersproject/keccak256": ">=5.0.0-beta.127",
- "@ethersproject/logger": ">=5.0.0-beta.129",
- "@ethersproject/properties": ">=5.0.0-beta.131",
- "@ethersproject/strings": ">=5.0.0-beta.130"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/abstract-provider": {
- "version": "5.0.8",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bignumber": "^5.0.13",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/networks": "^5.0.7",
- "@ethersproject/properties": "^5.0.7",
- "@ethersproject/transactions": "^5.0.9",
- "@ethersproject/web": "^5.0.12"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/abstract-signer": {
- "version": "5.0.10",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/abstract-provider": "^5.0.8",
- "@ethersproject/bignumber": "^5.0.13",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/properties": "^5.0.7"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/address": {
- "version": "5.0.9",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bignumber": "^5.0.13",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/keccak256": "^5.0.7",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/rlp": "^5.0.7"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/base64": {
- "version": "5.0.7",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/bignumber": {
- "version": "5.0.13",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8",
- "bn.js": "^4.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/bytes": {
- "version": "5.0.9",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/logger": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/constants": {
- "version": "5.0.8",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bignumber": "^5.0.13"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/hash": {
- "version": "5.0.10",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/abstract-signer": "^5.0.10",
- "@ethersproject/address": "^5.0.9",
- "@ethersproject/bignumber": "^5.0.13",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/keccak256": "^5.0.7",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/properties": "^5.0.7",
- "@ethersproject/strings": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/keccak256": {
- "version": "5.0.7",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9",
- "js-sha3": "0.5.7"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/logger": {
- "version": "5.0.8",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/@ethersproject/networks": {
- "version": "5.0.7",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/logger": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/properties": {
- "version": "5.0.7",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/logger": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/rlp": {
- "version": "5.0.7",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/signing-key": {
- "version": "5.0.8",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/properties": "^5.0.7",
- "elliptic": "6.5.3"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/strings": {
- "version": "5.0.8",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/constants": "^5.0.8",
- "@ethersproject/logger": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/transactions": {
- "version": "5.0.9",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/address": "^5.0.9",
- "@ethersproject/bignumber": "^5.0.13",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/constants": "^5.0.8",
- "@ethersproject/keccak256": "^5.0.7",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/properties": "^5.0.7",
- "@ethersproject/rlp": "^5.0.7",
- "@ethersproject/signing-key": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@ethersproject/web": {
- "version": "5.0.12",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
- },
- {
- "type": "individual",
- "url": "https://www.buymeacoffee.com/ricmoo"
- }
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@ethersproject/base64": "^5.0.7",
- "@ethersproject/bytes": "^5.0.9",
- "@ethersproject/logger": "^5.0.8",
- "@ethersproject/properties": "^5.0.7",
- "@ethersproject/strings": "^5.0.8"
- }
- },
- "node_modules/ganache-core/node_modules/@sindresorhus/is": {
- "version": "0.14.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/@szmarczak/http-timer": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "defer-to-connect": "^1.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/@types/bn.js": {
- "version": "4.11.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/@types/node": {
- "version": "14.14.20",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/@types/pbkdf2": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/@types/secp256k1": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/@yarnpkg/lockfile": {
- "version": "1.1.0",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/ganache-core/node_modules/abstract-leveldown": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/accepts": {
- "version": "1.3.7",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/aes-js": {
- "version": "3.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ajv": {
- "version": "6.12.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ganache-core/node_modules/ansi-styles": {
- "version": "3.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/arr-diff": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/arr-flatten": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/arr-union": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/array-flatten": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/array-unique": {
- "version": "0.3.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/asn1": {
- "version": "0.2.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/asn1.js": {
- "version": "5.4.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/assert-plus": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/ganache-core/node_modules/assign-symbols": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/async": {
- "version": "2.6.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lodash": "^4.17.11"
- }
- },
- "node_modules/ganache-core/node_modules/async-eventemitter": {
- "version": "0.2.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async": "^2.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/async-limiter": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/asynckit": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/atob": {
- "version": "2.1.2",
- "dev": true,
- "license": "(MIT OR Apache-2.0)",
- "bin": {
- "atob": "bin/atob.js"
- },
- "engines": {
- "node": ">= 4.5.0"
- }
- },
- "node_modules/ganache-core/node_modules/aws-sign2": {
- "version": "0.7.0",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/aws4": {
- "version": "1.11.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-code-frame": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- }
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-regex": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-styles": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/chalk": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/js-tokens": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/strip-ansi": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/supports-color": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-core": {
- "version": "6.26.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- }
- },
- "node_modules/ganache-core/node_modules/babel-core/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-core/node_modules/json5": {
- "version": "0.5.1",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/ganache-core/node_modules/babel-core/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-core/node_modules/slash": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-generator": {
- "version": "6.26.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "detect-indent": "^4.0.0",
- "jsesc": "^1.3.0",
- "lodash": "^4.17.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-generator/node_modules/jsesc": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-builder-binary-assignment-operator-visitor": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-explode-assignable-expression": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-call-delegate": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-define-map": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-explode-assignable-expression": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-function-name": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-get-function-arity": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-hoist-variables": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-optimise-call-expression": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-regex": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-remap-async-to-generator": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helper-replace-supers": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-helpers": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-messages": {
- "version": "6.23.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-check-es2015-constants": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-syntax-async-functions": {
- "version": "6.13.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-plugin-syntax-exponentiation-operator": {
- "version": "6.13.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-plugin-syntax-trailing-function-commas": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-async-to-generator": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-remap-async-to-generator": "^6.24.1",
- "babel-plugin-syntax-async-functions": "^6.8.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-arrow-functions": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoped-functions": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoping": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-classes": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-define-map": "^6.24.1",
- "babel-helper-function-name": "^6.24.1",
- "babel-helper-optimise-call-expression": "^6.24.1",
- "babel-helper-replace-supers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-computed-properties": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-destructuring": {
- "version": "6.23.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-duplicate-keys": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-for-of": {
- "version": "6.23.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-function-name": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-function-name": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-literals": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-amd": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-commonjs": {
- "version": "6.26.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-transform-strict-mode": "^6.24.1",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-types": "^6.26.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-systemjs": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-hoist-variables": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-umd": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-object-super": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-replace-supers": "^6.24.1",
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-parameters": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-call-delegate": "^6.24.1",
- "babel-helper-get-function-arity": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1",
- "babel-traverse": "^6.24.1",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-shorthand-properties": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-spread": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-sticky-regex": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-template-literals": {
- "version": "6.22.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-typeof-symbol": {
- "version": "6.23.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-unicode-regex": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-regex": "^6.24.1",
- "babel-runtime": "^6.22.0",
- "regexpu-core": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-exponentiation-operator": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
- "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-regenerator": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerator-transform": "^0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-plugin-transform-strict-mode": {
- "version": "6.24.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-types": "^6.24.1"
- }
- },
- "node_modules/ganache-core/node_modules/babel-preset-env": {
- "version": "1.7.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-plugin-check-es2015-constants": "^6.22.0",
- "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
- "babel-plugin-transform-async-to-generator": "^6.22.0",
- "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
- "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
- "babel-plugin-transform-es2015-classes": "^6.23.0",
- "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
- "babel-plugin-transform-es2015-destructuring": "^6.23.0",
- "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
- "babel-plugin-transform-es2015-for-of": "^6.23.0",
- "babel-plugin-transform-es2015-function-name": "^6.22.0",
- "babel-plugin-transform-es2015-literals": "^6.22.0",
- "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
- "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
- "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
- "babel-plugin-transform-es2015-object-super": "^6.22.0",
- "babel-plugin-transform-es2015-parameters": "^6.23.0",
- "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
- "babel-plugin-transform-es2015-spread": "^6.22.0",
- "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
- "babel-plugin-transform-es2015-template-literals": "^6.22.0",
- "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
- "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
- "babel-plugin-transform-exponentiation-operator": "^6.22.0",
- "babel-plugin-transform-regenerator": "^6.22.0",
- "browserslist": "^3.2.6",
- "invariant": "^2.2.2",
- "semver": "^5.3.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-preset-env/node_modules/semver": {
- "version": "5.7.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/babel-register": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
- }
- },
- "node_modules/ganache-core/node_modules/babel-register/node_modules/source-map-support": {
- "version": "0.4.18",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "source-map": "^0.5.6"
- }
- },
- "node_modules/ganache-core/node_modules/babel-runtime": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-template": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/ganache-core/node_modules/babel-traverse": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-code-frame": "^6.26.0",
- "babel-messages": "^6.23.0",
- "babel-runtime": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "debug": "^2.6.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/ganache-core/node_modules/babel-traverse/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-traverse/node_modules/globals": {
- "version": "9.18.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babel-traverse/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/babel-types": {
- "version": "6.26.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- }
- },
- "node_modules/ganache-core/node_modules/babel-types/node_modules/to-fast-properties": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/babelify": {
- "version": "7.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "babel-core": "^6.0.14",
- "object-assign": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/babylon": {
- "version": "6.18.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "babylon": "bin/babylon.js"
- }
- },
- "node_modules/ganache-core/node_modules/backoff": {
- "version": "2.5.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "precond": "0.2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/balanced-match": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/base": {
- "version": "0.11.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/base-x": {
- "version": "3.0.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/base/node_modules/define-property": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/base64-js": {
- "version": "1.5.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/ganache-core/node_modules/bcrypt-pbkdf/node_modules/tweetnacl": {
- "version": "0.14.5",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/ganache-core/node_modules/bignumber.js": {
- "version": "9.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/bip39": {
- "version": "2.5.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "create-hash": "^1.1.0",
- "pbkdf2": "^3.0.9",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "unorm": "^1.3.3"
- }
- },
- "node_modules/ganache-core/node_modules/blakejs": {
- "version": "1.1.0",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/ganache-core/node_modules/bluebird": {
- "version": "3.7.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/bn.js": {
- "version": "4.11.9",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/body-parser": {
- "version": "1.19.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/body-parser/node_modules/qs": {
- "version": "6.7.0",
- "dev": true,
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ganache-core/node_modules/brace-expansion": {
- "version": "1.1.11",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/brorand": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/browserify-aes": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/browserify-cipher": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/browserify-des": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/browserify-rsa": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^5.0.0",
- "randombytes": "^2.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/browserify-rsa/node_modules/bn.js": {
- "version": "5.1.3",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/browserify-sign": {
- "version": "4.2.1",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "bn.js": "^5.1.1",
- "browserify-rsa": "^4.0.1",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.3",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.5",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/browserify-sign/node_modules/bn.js": {
- "version": "5.1.3",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/browserify-sign/node_modules/readable-stream": {
- "version": "3.6.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ganache-core/node_modules/browserslist": {
- "version": "3.2.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "caniuse-lite": "^1.0.30000844",
- "electron-to-chromium": "^1.3.47"
- },
- "bin": {
- "browserslist": "cli.js"
- }
- },
- "node_modules/ganache-core/node_modules/bs58": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "base-x": "^3.0.2"
- }
- },
- "node_modules/ganache-core/node_modules/bs58check": {
- "version": "2.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bs58": "^4.0.0",
- "create-hash": "^1.1.0",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/buffer": {
- "version": "5.7.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/ganache-core/node_modules/buffer-from": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/buffer-to-arraybuffer": {
- "version": "0.0.5",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/buffer-xor": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/bufferutil": {
- "version": "4.0.3",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "node-gyp-build": "^4.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/bytes": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/bytewise": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bytewise-core": "^1.2.2",
- "typewise": "^1.0.3"
- }
- },
- "node_modules/ganache-core/node_modules/bytewise-core": {
- "version": "1.2.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "typewise-core": "^1.2"
- }
- },
- "node_modules/ganache-core/node_modules/cache-base": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/cacheable-request": {
- "version": "6.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ganache-core/node_modules/cacheable-request/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ganache-core/node_modules/cachedown": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "^2.4.1",
- "lru-cache": "^3.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/cachedown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/cachedown/node_modules/lru-cache": {
- "version": "3.2.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "pseudomap": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/call-bind": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/caniuse-lite": {
- "version": "1.0.30001174",
- "dev": true,
- "license": "CC-BY-4.0"
- },
- "node_modules/ganache-core/node_modules/caseless": {
- "version": "0.12.0",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/ganache-core/node_modules/chalk": {
- "version": "2.4.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/checkpoint-store": {
- "version": "1.1.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "functional-red-black-tree": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/chownr": {
- "version": "1.1.4",
- "dev": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ci-info": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/cids": {
- "version": "0.7.5",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "class-is": "^1.1.0",
- "multibase": "~0.6.0",
- "multicodec": "^1.0.0",
- "multihashes": "~0.4.15"
- },
- "engines": {
- "node": ">=4.0.0",
- "npm": ">=3.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/cids/node_modules/multicodec": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "buffer": "^5.6.0",
- "varint": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/cipher-base": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/class-is": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/class-utils": {
- "version": "0.3.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/define-property": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/is-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/class-utils/node_modules/kind-of": {
- "version": "5.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/clone": {
- "version": "2.1.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/ganache-core/node_modules/clone-response": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/collection-visit": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/color-convert": {
- "version": "1.9.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/ganache-core/node_modules/color-name": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/combined-stream": {
- "version": "1.0.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/component-emitter": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/concat-map": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/concat-stream": {
- "version": "1.6.2",
- "dev": true,
- "engines": [
- "node >= 0.8"
- ],
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/ganache-core/node_modules/content-disposition": {
- "version": "0.5.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safe-buffer": "5.1.2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/content-disposition/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/content-hash": {
- "version": "2.5.2",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "cids": "^0.7.1",
- "multicodec": "^0.5.5",
- "multihashes": "^0.4.15"
- }
- },
- "node_modules/ganache-core/node_modules/content-type": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/convert-source-map": {
- "version": "1.7.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/convert-source-map/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/cookie": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/cookie-signature": {
- "version": "1.0.6",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/cookiejar": {
- "version": "2.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/copy-descriptor": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/core-js": {
- "version": "2.6.12",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/core-js-pure": {
- "version": "3.8.2",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/ganache-core/node_modules/core-util-is": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/cors": {
- "version": "2.8.5",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ganache-core/node_modules/create-ecdh": {
- "version": "4.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.5.3"
- }
- },
- "node_modules/ganache-core/node_modules/create-hash": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/create-hmac": {
- "version": "1.1.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "node_modules/ganache-core/node_modules/cross-fetch": {
- "version": "2.2.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "node-fetch": "2.1.2",
- "whatwg-fetch": "2.0.4"
- }
- },
- "node_modules/ganache-core/node_modules/crypto-browserify": {
- "version": "3.12.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/d": {
- "version": "1.0.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/dashdash": {
- "version": "1.14.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/ganache-core/node_modules/debug": {
- "version": "3.2.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/decode-uri-component": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/ganache-core/node_modules/decompress-response": {
- "version": "3.3.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/deep-equal": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.1",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.2.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/defer-to-connect": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/deferred-leveldown": {
- "version": "4.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~5.0.0",
- "inherits": "^2.0.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/deferred-leveldown/node_modules/abstract-leveldown": {
- "version": "5.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/define-properties": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-keys": "^1.0.12"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ganache-core/node_modules/define-property": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/defined": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/delayed-stream": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/depd": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/des.js": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/destroy": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/detect-indent": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "repeating": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/diffie-hellman": {
- "version": "5.0.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/dom-walk": {
- "version": "0.1.2",
- "dev": true
- },
- "node_modules/ganache-core/node_modules/dotignore": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimatch": "^3.0.4"
- },
- "bin": {
- "ignored": "bin/ignored"
- }
- },
- "node_modules/ganache-core/node_modules/duplexer3": {
- "version": "0.1.4",
- "dev": true,
- "license": "BSD-3-Clause",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/ee-first": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/electron-to-chromium": {
- "version": "1.3.636",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/elliptic": {
- "version": "6.5.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/encodeurl": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/encoding": {
- "version": "0.1.13",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "iconv-lite": "^0.6.2"
- }
- },
- "node_modules/ganache-core/node_modules/encoding-down": {
- "version": "5.0.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "^5.0.0",
- "inherits": "^2.0.3",
- "level-codec": "^9.0.0",
- "level-errors": "^2.0.0",
- "xtend": "^4.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/encoding-down/node_modules/abstract-leveldown": {
- "version": "5.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/encoding/node_modules/iconv-lite": {
- "version": "0.6.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/end-of-stream": {
- "version": "1.4.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/errno": {
- "version": "0.1.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/ganache-core/node_modules/es-abstract": {
- "version": "1.18.0-next.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.2",
- "is-negative-zero": "^2.0.0",
- "is-regex": "^1.1.1",
- "object-inspect": "^1.8.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.1",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/es-to-primitive": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/es5-ext": {
- "version": "0.10.53",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/es6-iterator": {
- "version": "2.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/es6-symbol": {
- "version": "3.1.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/escape-html": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/esutils": {
- "version": "2.0.3",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/etag": {
- "version": "1.8.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/eth-block-tracker": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eth-query": "^2.1.0",
- "ethereumjs-tx": "^1.3.3",
- "ethereumjs-util": "^5.1.3",
- "ethjs-util": "^0.1.3",
- "json-rpc-engine": "^3.6.0",
- "pify": "^2.3.0",
- "tape": "^4.6.3"
- }
- },
- "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-tx": {
- "version": "1.3.7",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereum-common": "^0.0.18",
- "ethereumjs-util": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/pify": {
- "version": "2.3.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-ens-namehash": {
- "version": "2.0.8",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "idna-uts46-hx": "^2.3.1",
- "js-sha3": "^0.5.7"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-infura": {
- "version": "3.2.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "cross-fetch": "^2.1.1",
- "eth-json-rpc-middleware": "^1.5.0",
- "json-rpc-engine": "^3.4.0",
- "json-rpc-error": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware": {
- "version": "1.6.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "async": "^2.5.0",
- "eth-query": "^2.1.2",
- "eth-tx-summary": "^3.1.2",
- "ethereumjs-block": "^1.6.0",
- "ethereumjs-tx": "^1.3.3",
- "ethereumjs-util": "^5.1.2",
- "ethereumjs-vm": "^2.1.0",
- "fetch-ponyfill": "^4.0.0",
- "json-rpc-engine": "^3.6.0",
- "json-rpc-error": "^2.0.0",
- "json-stable-stringify": "^1.0.1",
- "promise-to-callback": "^1.0.0",
- "tape": "^4.6.3"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/abstract-leveldown": {
- "version": "2.6.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/deferred-leveldown": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-account": {
- "version": "2.0.5",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-util": "^5.0.0",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block": {
- "version": "1.7.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereum-common": "0.2.0",
- "ethereumjs-tx": "^1.2.2",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block/node_modules/ethereum-common": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-tx": {
- "version": "1.3.7",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereum-common": "^0.0.18",
- "ethereumjs-util": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm": {
- "version": "2.6.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.1.2",
- "async-eventemitter": "^0.2.2",
- "ethereumjs-account": "^2.0.3",
- "ethereumjs-block": "~2.2.0",
- "ethereumjs-common": "^1.1.0",
- "ethereumjs-util": "^6.0.0",
- "fake-merkle-patricia-tree": "^1.0.1",
- "functional-red-black-tree": "^1.0.1",
- "merkle-patricia-tree": "^2.3.2",
- "rustbn.js": "~0.2.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
- "version": "2.2.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-tx": "^2.1.1",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
- "version": "2.1.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/isarray": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-codec": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-errors": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "level-errors": "^1.0.3",
- "readable-stream": "^1.0.33",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream/node_modules/readable-stream": {
- "version": "1.1.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~1.0.15",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/readable-stream": {
- "version": "1.0.34",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/xtend": {
- "version": "2.1.2",
- "dev": true,
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/levelup": {
- "version": "1.3.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~1.2.1",
- "level-codec": "~7.0.0",
- "level-errors": "~1.0.3",
- "level-iterator-stream": "~1.3.0",
- "prr": "~1.0.1",
- "semver": "~5.4.1",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.7.1",
- "functional-red-black-tree": "^1.0.1",
- "immediate": "^3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree": {
- "version": "2.3.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^1.4.2",
- "ethereumjs-util": "^5.0.0",
- "level-ws": "0.0.0",
- "levelup": "^1.2.1",
- "memdown": "^1.0.0",
- "readable-stream": "^2.0.0",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree/node_modules/async": {
- "version": "1.5.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/object-keys": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/semver": {
- "version": "5.4.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/string_decoder": {
- "version": "0.10.31",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-lib": {
- "version": "0.1.29",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "nano-json-stream-parser": "^0.1.2",
- "servify": "^0.1.12",
- "ws": "^3.0.0",
- "xhr-request-promise": "^0.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/eth-query": {
- "version": "2.1.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "json-rpc-random-id": "^1.0.0",
- "xtend": "^4.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-sig-util": {
- "version": "3.0.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "buffer": "^5.2.1",
- "elliptic": "^6.4.0",
- "ethereumjs-abi": "0.6.5",
- "ethereumjs-util": "^5.1.1",
- "tweetnacl": "^1.0.0",
- "tweetnacl-util": "^0.15.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi": {
- "version": "0.6.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bn.js": "^4.10.0",
- "ethereumjs-util": "^4.3.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
- "version": "4.5.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.8.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "rlp": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary": {
- "version": "3.2.4",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "async": "^2.1.2",
- "clone": "^2.0.0",
- "concat-stream": "^1.5.1",
- "end-of-stream": "^1.1.0",
- "eth-query": "^2.0.2",
- "ethereumjs-block": "^1.4.1",
- "ethereumjs-tx": "^1.1.1",
- "ethereumjs-util": "^5.0.1",
- "ethereumjs-vm": "^2.6.0",
- "through2": "^2.0.3"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/abstract-leveldown": {
- "version": "2.6.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/deferred-leveldown": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-account": {
- "version": "2.0.5",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-util": "^5.0.0",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block": {
- "version": "1.7.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereum-common": "0.2.0",
- "ethereumjs-tx": "^1.2.2",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block/node_modules/ethereum-common": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-tx": {
- "version": "1.3.7",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereum-common": "^0.0.18",
- "ethereumjs-util": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm": {
- "version": "2.6.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.1.2",
- "async-eventemitter": "^0.2.2",
- "ethereumjs-account": "^2.0.3",
- "ethereumjs-block": "~2.2.0",
- "ethereumjs-common": "^1.1.0",
- "ethereumjs-util": "^6.0.0",
- "fake-merkle-patricia-tree": "^1.0.1",
- "functional-red-black-tree": "^1.0.1",
- "merkle-patricia-tree": "^2.3.2",
- "rustbn.js": "~0.2.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
- "version": "2.2.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-tx": "^2.1.1",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
- "version": "2.1.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/isarray": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-codec": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-errors": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "level-errors": "^1.0.3",
- "readable-stream": "^1.0.33",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream/node_modules/readable-stream": {
- "version": "1.1.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~1.0.15",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/readable-stream": {
- "version": "1.0.34",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/xtend": {
- "version": "2.1.2",
- "dev": true,
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/levelup": {
- "version": "1.3.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~1.2.1",
- "level-codec": "~7.0.0",
- "level-errors": "~1.0.3",
- "level-iterator-stream": "~1.3.0",
- "prr": "~1.0.1",
- "semver": "~5.4.1",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.7.1",
- "functional-red-black-tree": "^1.0.1",
- "immediate": "^3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree": {
- "version": "2.3.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^1.4.2",
- "ethereumjs-util": "^5.0.0",
- "level-ws": "0.0.0",
- "levelup": "^1.2.1",
- "memdown": "^1.0.0",
- "readable-stream": "^2.0.0",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree/node_modules/async": {
- "version": "1.5.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/object-keys": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/semver": {
- "version": "5.4.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/string_decoder": {
- "version": "0.10.31",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethashjs": {
- "version": "0.0.8",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.1.2",
- "buffer-xor": "^2.0.1",
- "ethereumjs-util": "^7.0.2",
- "miller-rabin": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethashjs/node_modules/bn.js": {
- "version": "5.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethashjs/node_modules/buffer-xor": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethashjs/node_modules/ethereumjs-util": {
- "version": "7.0.7",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^5.1.2",
- "create-hash": "^1.1.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.4"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereum-bloom-filters": {
- "version": "1.0.7",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "js-sha3": "^0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereum-bloom-filters/node_modules/js-sha3": {
- "version": "0.8.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ethereum-common": {
- "version": "0.0.18",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereum-cryptography": {
- "version": "0.1.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/pbkdf2": "^3.0.0",
- "@types/secp256k1": "^4.0.1",
- "blakejs": "^1.1.0",
- "browserify-aes": "^1.2.0",
- "bs58check": "^2.1.2",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "hash.js": "^1.1.7",
- "keccak": "^3.0.0",
- "pbkdf2": "^3.0.17",
- "randombytes": "^2.1.0",
- "safe-buffer": "^5.1.2",
- "scrypt-js": "^3.0.0",
- "secp256k1": "^4.0.1",
- "setimmediate": "^1.0.5"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-abi": {
- "version": "0.6.8",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bn.js": "^4.11.8",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-account": {
- "version": "3.0.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-util": "^6.0.0",
- "rlp": "^2.2.1",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block": {
- "version": "2.2.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-tx": "^2.1.1",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/abstract-leveldown": {
- "version": "2.6.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/deferred-leveldown": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/isarray": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-codec": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-errors": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "level-errors": "^1.0.3",
- "readable-stream": "^1.0.33",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": {
- "version": "1.1.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~1.0.15",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": {
- "version": "1.0.34",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": {
- "version": "2.1.2",
- "dev": true,
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/levelup": {
- "version": "1.3.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~1.2.1",
- "level-codec": "~7.0.0",
- "level-errors": "~1.0.3",
- "level-iterator-stream": "~1.3.0",
- "prr": "~1.0.1",
- "semver": "~5.4.1",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.7.1",
- "functional-red-black-tree": "^1.0.1",
- "immediate": "^3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": {
- "version": "2.3.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^1.4.2",
- "ethereumjs-util": "^5.0.0",
- "level-ws": "0.0.0",
- "levelup": "^1.2.1",
- "memdown": "^1.0.0",
- "readable-stream": "^2.0.0",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": {
- "version": "1.5.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/object-keys": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/semver": {
- "version": "5.4.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/string_decoder": {
- "version": "0.10.31",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-blockchain": {
- "version": "4.0.4",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.6.1",
- "ethashjs": "~0.0.7",
- "ethereumjs-block": "~2.2.2",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.1.0",
- "flow-stoplight": "^1.0.0",
- "level-mem": "^3.0.1",
- "lru-cache": "^5.1.1",
- "rlp": "^2.2.2",
- "semaphore": "^1.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-common": {
- "version": "1.5.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-tx": {
- "version": "2.1.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm": {
- "version": "4.2.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.1.2",
- "async-eventemitter": "^0.2.2",
- "core-js-pure": "^3.0.1",
- "ethereumjs-account": "^3.0.0",
- "ethereumjs-block": "^2.2.2",
- "ethereumjs-blockchain": "^4.0.3",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-tx": "^2.1.2",
- "ethereumjs-util": "^6.2.0",
- "fake-merkle-patricia-tree": "^1.0.1",
- "functional-red-black-tree": "^1.0.1",
- "merkle-patricia-tree": "^2.3.2",
- "rustbn.js": "~0.2.0",
- "safe-buffer": "^5.1.1",
- "util.promisify": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/abstract-leveldown": {
- "version": "2.6.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/deferred-leveldown": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/isarray": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-codec": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-errors": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "level-errors": "^1.0.3",
- "readable-stream": "^1.0.33",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": {
- "version": "1.1.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~1.0.15",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": {
- "version": "1.0.34",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": {
- "version": "2.1.2",
- "dev": true,
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/levelup": {
- "version": "1.3.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~1.2.1",
- "level-codec": "~7.0.0",
- "level-errors": "~1.0.3",
- "level-iterator-stream": "~1.3.0",
- "prr": "~1.0.1",
- "semver": "~5.4.1",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.7.1",
- "functional-red-black-tree": "^1.0.1",
- "immediate": "^3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": {
- "version": "2.3.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^1.4.2",
- "ethereumjs-util": "^5.0.0",
- "level-ws": "0.0.0",
- "levelup": "^1.2.1",
- "memdown": "^1.0.0",
- "readable-stream": "^2.0.0",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": {
- "version": "1.5.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/object-keys": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/semver": {
- "version": "5.4.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/string_decoder": {
- "version": "0.10.31",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ethereumjs-wallet": {
- "version": "0.6.5",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "aes-js": "^3.1.1",
- "bs58check": "^2.1.2",
- "ethereum-cryptography": "^0.1.3",
- "ethereumjs-util": "^6.0.0",
- "randombytes": "^2.0.6",
- "safe-buffer": "^5.1.2",
- "scryptsy": "^1.2.1",
- "utf8": "^3.0.0",
- "uuid": "^3.3.2"
- }
- },
- "node_modules/ganache-core/node_modules/ethjs-unit": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "number-to-bn": "1.7.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ganache-core/node_modules/ethjs-unit/node_modules/bn.js": {
- "version": "4.11.6",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ethjs-util": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-hex-prefixed": "1.0.0",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ganache-core/node_modules/eventemitter3": {
- "version": "4.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/events": {
- "version": "3.2.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/ganache-core/node_modules/evp_bytestokey": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets": {
- "version": "2.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/define-property": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/kind-of": {
- "version": "5.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/expand-brackets/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/express": {
- "version": "4.17.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "accepts": "~1.3.7",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
- "content-type": "~1.0.4",
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/express/node_modules/qs": {
- "version": "6.7.0",
- "dev": true,
- "license": "BSD-3-Clause",
- "optional": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ganache-core/node_modules/express/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ext": {
- "version": "1.4.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "type": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ext/node_modules/type": {
- "version": "2.1.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/extend": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/extend-shallow": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/extglob": {
- "version": "2.0.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/extglob/node_modules/define-property": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/extglob/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/extglob/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/extsprintf": {
- "version": "1.3.0",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/fake-merkle-patricia-tree": {
- "version": "1.0.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "checkpoint-store": "^1.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/fetch-ponyfill": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "node-fetch": "~1.7.1"
- }
- },
- "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": {
- "version": "1.7.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/finalhandler": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root": {
- "version": "1.2.1",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "fs-extra": "^4.0.3",
- "micromatch": "^3.1.4"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces": {
- "version": "2.3.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fs-extra": {
- "version": "4.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/micromatch": {
- "version": "3.1.10",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/to-regex-range": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/flow-stoplight": {
- "version": "1.0.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/for-each": {
- "version": "0.3.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/ganache-core/node_modules/for-in": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/forever-agent": {
- "version": "0.6.1",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/form-data": {
- "version": "2.3.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/ganache-core/node_modules/forwarded": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/fragment-cache": {
- "version": "0.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "map-cache": "^0.2.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/fresh": {
- "version": "0.5.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/fs-extra": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/ganache-core/node_modules/fs.realpath": {
- "version": "1.0.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/function-bind": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/get-intrinsic": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/get-stream": {
- "version": "5.2.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ganache-core/node_modules/get-value": {
- "version": "2.0.6",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/getpass": {
- "version": "0.1.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/glob": {
- "version": "7.1.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/global": {
- "version": "4.4.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "node_modules/ganache-core/node_modules/got": {
- "version": "9.6.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/ganache-core/node_modules/got/node_modules/get-stream": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/graceful-fs": {
- "version": "4.2.4",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/har-schema": {
- "version": "2.0.0",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/har-validator": {
- "version": "5.1.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/has": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-ansi": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-ansi/node_modules/ansi-regex": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-flag": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/has-symbol-support-x": {
- "version": "1.4.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/has-symbols": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/has-to-string-tag-x": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "has-symbol-support-x": "^1.4.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/has-value": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-values": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-values/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/has-values/node_modules/is-number": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/has-values/node_modules/kind-of": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/hash-base": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/hash-base/node_modules/readable-stream": {
- "version": "3.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ganache-core/node_modules/hash.js": {
- "version": "1.1.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/heap": {
- "version": "0.2.6",
- "dev": true
- },
- "node_modules/ganache-core/node_modules/hmac-drbg": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/home-or-tmp": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "dev": true,
- "license": "BSD-2-Clause",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/http-errors": {
- "version": "1.7.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/http-errors/node_modules/inherits": {
- "version": "2.0.3",
- "dev": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/http-https": {
- "version": "1.0.0",
- "dev": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/http-signature": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/ganache-core/node_modules/iconv-lite": {
- "version": "0.4.24",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/idna-uts46-hx": {
- "version": "2.3.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "punycode": "2.1.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/idna-uts46-hx/node_modules/punycode": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/ieee754": {
- "version": "1.2.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/ganache-core/node_modules/immediate": {
- "version": "3.2.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/inflight": {
- "version": "1.0.6",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/ganache-core/node_modules/inherits": {
- "version": "2.0.4",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/invariant": {
- "version": "2.2.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ganache-core/node_modules/is-accessor-descriptor": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-arguments": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-callable": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-ci": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
- "node_modules/ganache-core/node_modules/is-data-descriptor": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-date-object": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-descriptor": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-extendable": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-plain-object": "^2.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-finite": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/ganache-core/node_modules/is-fn": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-function": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/is-hex-prefixed": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ganache-core/node_modules/is-negative-zero": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-object": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-plain-obj": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-plain-object": {
- "version": "2.0.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-regex": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-retry-allowed": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/is-symbol": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/is-typedarray": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/is-windows": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/isarray": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/isexe": {
- "version": "2.0.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/isobject": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/isstream": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/isurl": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/ganache-core/node_modules/js-sha3": {
- "version": "0.5.7",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/js-tokens": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/jsbn": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/json-buffer": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/json-rpc-engine": {
- "version": "3.8.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "async": "^2.0.1",
- "babel-preset-env": "^1.7.0",
- "babelify": "^7.3.0",
- "json-rpc-error": "^2.0.0",
- "promise-to-callback": "^1.0.0",
- "safe-event-emitter": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/json-rpc-error": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/json-rpc-random-id": {
- "version": "1.0.1",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/json-schema": {
- "version": "0.2.3",
- "dev": true
- },
- "node_modules/ganache-core/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/json-stable-stringify": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "jsonify": "~0.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/jsonfile": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/ganache-core/node_modules/jsonify": {
- "version": "0.0.0",
- "dev": true,
- "license": "Public Domain"
- },
- "node_modules/ganache-core/node_modules/jsprim": {
- "version": "1.4.1",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/keccak": {
- "version": "3.0.1",
- "dev": true,
- "hasInstallScript": true,
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/keyv": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "json-buffer": "3.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/kind-of": {
- "version": "6.0.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/klaw-sync": {
- "version": "6.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.11"
- }
- },
- "node_modules/ganache-core/node_modules/level-codec": {
- "version": "9.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.6.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-errors": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-iterator-stream": {
- "version": "2.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.5",
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/level-mem": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "level-packager": "~4.0.0",
- "memdown": "~3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-mem/node_modules/abstract-leveldown": {
- "version": "5.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-mem/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/level-mem/node_modules/memdown": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~5.0.0",
- "functional-red-black-tree": "~1.0.1",
- "immediate": "~3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-mem/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/level-packager": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "encoding-down": "~5.0.0",
- "levelup": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/level-post": {
- "version": "1.0.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ltgt": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/level-sublevel": {
- "version": "6.6.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bytewise": "~1.1.0",
- "level-codec": "^9.0.0",
- "level-errors": "^2.0.0",
- "level-iterator-stream": "^2.0.3",
- "ltgt": "~2.1.1",
- "pull-defer": "^0.2.2",
- "pull-level": "^2.0.3",
- "pull-stream": "^3.6.8",
- "typewiselite": "~1.0.0",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/level-ws": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.8",
- "xtend": "^4.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/levelup": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~4.0.0",
- "level-errors": "~2.0.0",
- "level-iterator-stream": "~3.0.0",
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/levelup/node_modules/level-iterator-stream": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/lodash": {
- "version": "4.17.20",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/looper": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/loose-envify": {
- "version": "1.4.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/ganache-core/node_modules/lowercase-keys": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/lru-cache": {
- "version": "5.1.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/ganache-core/node_modules/ltgt": {
- "version": "2.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/map-cache": {
- "version": "0.2.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/map-visit": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/md5.js": {
- "version": "1.3.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/media-typer": {
- "version": "0.3.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/merge-descriptors": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/merkle-patricia-tree": {
- "version": "3.0.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.6.1",
- "ethereumjs-util": "^5.2.0",
- "level-mem": "^3.0.1",
- "level-ws": "^1.0.0",
- "readable-stream": "^3.0.6",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/readable-stream": {
- "version": "3.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ganache-core/node_modules/methods": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/miller-rabin": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- },
- "bin": {
- "miller-rabin": "bin/miller-rabin"
- }
- },
- "node_modules/ganache-core/node_modules/mime": {
- "version": "1.6.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/mime-db": {
- "version": "1.45.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/mime-types": {
- "version": "2.1.28",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.45.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/mimic-response": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/min-document": {
- "version": "2.19.0",
- "dev": true,
- "dependencies": {
- "dom-walk": "^0.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/minimatch": {
- "version": "3.0.4",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/minimist": {
- "version": "1.2.5",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/minizlib": {
- "version": "1.3.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "minipass": "^2.9.0"
- }
- },
- "node_modules/ganache-core/node_modules/minizlib/node_modules/minipass": {
- "version": "2.9.0",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/mixin-deep": {
- "version": "1.3.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/mkdirp": {
- "version": "0.5.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.5"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/ganache-core/node_modules/mkdirp-promise": {
- "version": "5.0.1",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "mkdirp": "*"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/mock-fs": {
- "version": "4.13.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/ms": {
- "version": "2.1.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/multibase": {
- "version": "0.6.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "base-x": "^3.0.8",
- "buffer": "^5.5.0"
- }
- },
- "node_modules/ganache-core/node_modules/multicodec": {
- "version": "0.5.7",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "varint": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/multihashes": {
- "version": "0.4.21",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "multibase": "^0.7.0",
- "varint": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/multihashes/node_modules/multibase": {
- "version": "0.7.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "base-x": "^3.0.8",
- "buffer": "^5.5.0"
- }
- },
- "node_modules/ganache-core/node_modules/nano-json-stream-parser": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/nanomatch": {
- "version": "1.2.13",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/negotiator": {
- "version": "0.6.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/next-tick": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/nice-try": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/node-addon-api": {
- "version": "2.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/node-fetch": {
- "version": "2.1.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "4.x || >=6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/node-gyp-build": {
- "version": "4.2.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/ganache-core/node_modules/normalize-url": {
- "version": "4.5.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ganache-core/node_modules/number-to-bn": {
- "version": "1.7.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ganache-core/node_modules/number-to-bn/node_modules/bn.js": {
- "version": "4.11.6",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/oauth-sign": {
- "version": "0.9.0",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/object-assign": {
- "version": "4.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy": {
- "version": "0.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/define-property": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
- "version": "5.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-copy/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object-inspect": {
- "version": "1.9.0",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/object-is": {
- "version": "1.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/object-keys": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ganache-core/node_modules/object-visit": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/object.assign": {
- "version": "4.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/object.getownpropertydescriptors": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/object.pick": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/oboe": {
- "version": "2.1.4",
- "dev": true,
- "license": "BSD",
- "optional": true,
- "dependencies": {
- "http-https": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/on-finished": {
- "version": "2.3.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/once": {
- "version": "1.4.0",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/ganache-core/node_modules/os-homedir": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/os-tmpdir": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/p-cancelable": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/p-timeout": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "p-finally": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/p-timeout/node_modules/p-finally": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/parse-asn1": {
- "version": "5.1.6",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "asn1.js": "^5.2.0",
- "browserify-aes": "^1.0.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/parse-headers": {
- "version": "2.0.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/parseurl": {
- "version": "1.3.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/pascalcase": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package": {
- "version": "6.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@yarnpkg/lockfile": "^1.1.0",
- "chalk": "^2.4.2",
- "cross-spawn": "^6.0.5",
- "find-yarn-workspace-root": "^1.2.1",
- "fs-extra": "^7.0.1",
- "is-ci": "^2.0.0",
- "klaw-sync": "^6.0.0",
- "minimist": "^1.2.0",
- "rimraf": "^2.6.3",
- "semver": "^5.6.0",
- "slash": "^2.0.0",
- "tmp": "^0.0.33"
- },
- "bin": {
- "patch-package": "index.js"
- },
- "engines": {
- "npm": ">5"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/cross-spawn": {
- "version": "6.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/path-key": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/semver": {
- "version": "5.7.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-command": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-regex": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/slash": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/tmp": {
- "version": "0.0.33",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/patch-package/node_modules/which": {
- "version": "1.3.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/ganache-core/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/path-parse": {
- "version": "1.0.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/pbkdf2": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/ganache-core/node_modules/performance-now": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/posix-character-classes": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/precond": {
- "version": "0.2.3",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/prepend-http": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/private": {
- "version": "0.1.8",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/process": {
- "version": "0.11.10",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/process-nextick-args": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/promise-to-callback": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-fn": "^1.0.0",
- "set-immediate-shim": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/proxy-addr": {
- "version": "2.0.6",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "forwarded": "~0.1.2",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ganache-core/node_modules/prr": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/pseudomap": {
- "version": "1.0.2",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/psl": {
- "version": "1.8.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/public-encrypt": {
- "version": "4.0.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/pull-cat": {
- "version": "1.1.11",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/pull-defer": {
- "version": "0.2.3",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/pull-level": {
- "version": "2.0.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "level-post": "^1.0.7",
- "pull-cat": "^1.1.9",
- "pull-live": "^1.0.1",
- "pull-pushable": "^2.0.0",
- "pull-stream": "^3.4.0",
- "pull-window": "^2.1.4",
- "stream-to-pull-stream": "^1.7.1"
- }
- },
- "node_modules/ganache-core/node_modules/pull-live": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pull-cat": "^1.1.9",
- "pull-stream": "^3.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/pull-pushable": {
- "version": "2.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/pull-stream": {
- "version": "3.6.14",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/pull-window": {
- "version": "2.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "looper": "^2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/pump": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/ganache-core/node_modules/punycode": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/qs": {
- "version": "6.5.2",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ganache-core/node_modules/query-string": {
- "version": "5.1.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "decode-uri-component": "^0.2.0",
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/randombytes": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/randomfill": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/range-parser": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/raw-body": {
- "version": "2.4.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/readable-stream": {
- "version": "2.3.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/regenerate": {
- "version": "1.4.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/regenerator-runtime": {
- "version": "0.11.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/regenerator-transform": {
- "version": "0.10.1",
- "dev": true,
- "license": "BSD",
- "dependencies": {
- "babel-runtime": "^6.18.0",
- "babel-types": "^6.19.0",
- "private": "^0.1.6"
- }
- },
- "node_modules/ganache-core/node_modules/regex-not": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/regexp.prototype.flags": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/regexp.prototype.flags/node_modules/es-abstract": {
- "version": "1.17.7",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.2",
- "is-regex": "^1.1.1",
- "object-inspect": "^1.8.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.1",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/regexpu-core": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.2.1",
- "regjsgen": "^0.2.0",
- "regjsparser": "^0.1.4"
- }
- },
- "node_modules/ganache-core/node_modules/regjsgen": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/regjsparser": {
- "version": "0.1.5",
- "dev": true,
- "license": "BSD",
- "dependencies": {
- "jsesc": "~0.5.0"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/ganache-core/node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
- "node_modules/ganache-core/node_modules/repeat-element": {
- "version": "1.1.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/repeat-string": {
- "version": "1.6.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/ganache-core/node_modules/repeating": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-finite": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/request": {
- "version": "2.88.2",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/ganache-core/node_modules/resolve-url": {
- "version": "0.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/responselike": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/resumer": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "through": "~2.3.4"
- }
- },
- "node_modules/ganache-core/node_modules/ret": {
- "version": "0.1.15",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/ganache-core/node_modules/rimraf": {
- "version": "2.6.3",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/ganache-core/node_modules/ripemd160": {
- "version": "2.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/rlp": {
- "version": "2.2.6",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.1"
- },
- "bin": {
- "rlp": "bin/rlp"
- }
- },
- "node_modules/ganache-core/node_modules/rustbn.js": {
- "version": "0.2.0",
- "dev": true,
- "license": "(MIT OR Apache-2.0)"
- },
- "node_modules/ganache-core/node_modules/safe-buffer": {
- "version": "5.2.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/safe-event-emitter": {
- "version": "1.0.1",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "events": "^3.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/safe-regex": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ret": "~0.1.10"
- }
- },
- "node_modules/ganache-core/node_modules/safer-buffer": {
- "version": "2.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/scrypt-js": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/scryptsy": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "pbkdf2": "^3.0.3"
- }
- },
- "node_modules/ganache-core/node_modules/secp256k1": {
- "version": "4.0.2",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "elliptic": "^6.5.2",
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/seedrandom": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/semaphore": {
- "version": "1.1.0",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/send": {
- "version": "0.17.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/send/node_modules/ms": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/serve-static": {
- "version": "1.14.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/ganache-core/node_modules/servify": {
- "version": "0.1.12",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "body-parser": "^1.16.0",
- "cors": "^2.8.1",
- "express": "^4.14.0",
- "request": "^2.79.0",
- "xhr": "^2.3.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/set-immediate-shim": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/set-value": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/set-value/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/set-value/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/setimmediate": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/setprototypeof": {
- "version": "1.1.1",
- "dev": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/sha.js": {
- "version": "2.4.11",
- "dev": true,
- "license": "(MIT AND BSD-3-Clause)",
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- },
- "bin": {
- "sha.js": "bin.js"
- }
- },
- "node_modules/ganache-core/node_modules/simple-concat": {
- "version": "1.0.1",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/simple-get": {
- "version": "2.8.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "decompress-response": "^3.3.0",
- "once": "^1.3.1",
- "simple-concat": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon": {
- "version": "0.8.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon-node": {
- "version": "2.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon-node/node_modules/define-property": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon-util": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/define-property": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/extend-shallow": {
- "version": "2.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/kind-of": {
- "version": "5.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/snapdragon/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/source-map": {
- "version": "0.5.7",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/source-map-resolve": {
- "version": "0.5.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/source-map-support": {
- "version": "0.5.12",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/source-map-url": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/split-string": {
- "version": "3.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "extend-shallow": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/sshpk": {
- "version": "1.16.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/sshpk/node_modules/tweetnacl": {
- "version": "0.14.5",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/ganache-core/node_modules/static-extend": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/define-property": {
- "version": "0.2.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/is-descriptor": {
- "version": "0.1.6",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/static-extend/node_modules/kind-of": {
- "version": "5.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/statuses": {
- "version": "1.5.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/stream-to-pull-stream": {
- "version": "1.7.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "looper": "^3.0.0",
- "pull-stream": "^3.2.3"
- }
- },
- "node_modules/ganache-core/node_modules/stream-to-pull-stream/node_modules/looper": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/strict-uri-encode": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/string_decoder": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/string.prototype.trim": {
- "version": "1.2.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/string.prototype.trimend": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/string.prototype.trimstart": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/strip-hex-prefix": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-hex-prefixed": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/ganache-core/node_modules/supports-color": {
- "version": "5.5.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js": {
- "version": "0.1.40",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bluebird": "^3.5.0",
- "buffer": "^5.0.5",
- "eth-lib": "^0.1.26",
- "fs-extra": "^4.0.2",
- "got": "^7.1.0",
- "mime-types": "^2.1.16",
- "mkdirp-promise": "^5.0.1",
- "mock-fs": "^4.1.0",
- "setimmediate": "^1.0.5",
- "tar": "^4.0.2",
- "xhr-request": "^1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/fs-extra": {
- "version": "4.0.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/get-stream": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/got": {
- "version": "7.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "decompress-response": "^3.2.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "is-retry-allowed": "^1.0.0",
- "is-stream": "^1.0.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "p-cancelable": "^0.3.0",
- "p-timeout": "^1.1.1",
- "safe-buffer": "^5.0.1",
- "timed-out": "^4.0.0",
- "url-parse-lax": "^1.0.0",
- "url-to-options": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/is-stream": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/p-cancelable": {
- "version": "0.3.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/prepend-http": {
- "version": "1.0.4",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/swarm-js/node_modules/url-parse-lax": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "prepend-http": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/tape": {
- "version": "4.13.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-equal": "~1.1.1",
- "defined": "~1.0.0",
- "dotignore": "~0.1.2",
- "for-each": "~0.3.3",
- "function-bind": "~1.1.1",
- "glob": "~7.1.6",
- "has": "~1.0.3",
- "inherits": "~2.0.4",
- "is-regex": "~1.0.5",
- "minimist": "~1.2.5",
- "object-inspect": "~1.7.0",
- "resolve": "~1.17.0",
- "resumer": "~0.0.0",
- "string.prototype.trim": "~1.2.1",
- "through": "~2.3.8"
- },
- "bin": {
- "tape": "bin/tape"
- }
- },
- "node_modules/ganache-core/node_modules/tape/node_modules/glob": {
- "version": "7.1.6",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/ganache-core/node_modules/tape/node_modules/is-regex": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/tape/node_modules/object-inspect": {
- "version": "1.7.0",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/tape/node_modules/resolve": {
- "version": "1.17.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/tar": {
- "version": "4.4.13",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- },
- "engines": {
- "node": ">=4.5"
- }
- },
- "node_modules/ganache-core/node_modules/tar/node_modules/fs-minipass": {
- "version": "1.2.7",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "minipass": "^2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/tar/node_modules/minipass": {
- "version": "2.9.0",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/through": {
- "version": "2.3.8",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/through2": {
- "version": "2.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/timed-out": {
- "version": "4.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/tmp": {
- "version": "0.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "rimraf": "^2.6.3"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/to-object-path": {
- "version": "0.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/to-object-path/node_modules/is-buffer": {
- "version": "1.1.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/to-object-path/node_modules/kind-of": {
- "version": "3.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/to-readable-stream": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ganache-core/node_modules/to-regex": {
- "version": "3.0.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/toidentifier": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/ganache-core/node_modules/tough-cookie": {
- "version": "2.5.0",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/ganache-core/node_modules/trim-right": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/tunnel-agent": {
- "version": "0.6.0",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ganache-core/node_modules/tweetnacl": {
- "version": "1.0.3",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/ganache-core/node_modules/tweetnacl-util": {
- "version": "0.15.1",
- "dev": true,
- "license": "Unlicense"
- },
- "node_modules/ganache-core/node_modules/type": {
- "version": "1.2.0",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/type-is": {
- "version": "1.6.18",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ganache-core/node_modules/typedarray": {
- "version": "0.0.6",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/typewise": {
- "version": "1.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "typewise-core": "^1.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/typewise-core": {
- "version": "1.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/typewiselite": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/ultron": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/underscore": {
- "version": "1.9.1",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/union-value": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/union-value/node_modules/is-extendable": {
- "version": "0.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/universalify": {
- "version": "0.1.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/unorm": {
- "version": "1.6.0",
- "dev": true,
- "license": "MIT or GPL-2.0",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/unpipe": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/unset-value": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value": {
- "version": "0.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isarray": "1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/unset-value/node_modules/has-values": {
- "version": "0.1.4",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/uri-js": {
- "version": "4.4.1",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/urix": {
- "version": "0.1.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/url-parse-lax": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "prepend-http": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ganache-core/node_modules/url-set-query": {
- "version": "1.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/url-to-options": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/ganache-core/node_modules/use": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ganache-core/node_modules/utf-8-validate": {
- "version": "5.0.4",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "dependencies": {
- "node-gyp-build": "^4.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/utf8": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/util-deprecate": {
- "version": "1.0.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/util.promisify": {
- "version": "1.1.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "for-each": "^0.3.3",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/ganache-core/node_modules/utils-merge": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/ganache-core/node_modules/uuid": {
- "version": "3.4.0",
- "dev": true,
- "license": "MIT",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/ganache-core/node_modules/varint": {
- "version": "5.0.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/vary": {
- "version": "1.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/ganache-core/node_modules/verror": {
- "version": "1.10.0",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "license": "MIT",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3": {
- "version": "1.2.11",
- "dev": true,
- "hasInstallScript": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "web3-bzz": "1.2.11",
- "web3-core": "1.2.11",
- "web3-eth": "1.2.11",
- "web3-eth-personal": "1.2.11",
- "web3-net": "1.2.11",
- "web3-shh": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-bzz": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@types/node": "^12.12.6",
- "got": "9.6.0",
- "swarm-js": "^0.1.40",
- "underscore": "1.9.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-bzz/node_modules/@types/node": {
- "version": "12.19.12",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/web3-core": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@types/bn.js": "^4.11.5",
- "@types/node": "^12.12.6",
- "bignumber.js": "^9.0.0",
- "web3-core-helpers": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-core-requestmanager": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core-helpers": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "underscore": "1.9.1",
- "web3-eth-iban": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core-method": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@ethersproject/transactions": "^5.0.0-beta.135",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.11",
- "web3-core-promievent": "1.2.11",
- "web3-core-subscriptions": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core-promievent": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "eventemitter3": "4.0.4"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core-requestmanager": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.11",
- "web3-providers-http": "1.2.11",
- "web3-providers-ipc": "1.2.11",
- "web3-providers-ws": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core-subscriptions": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "eventemitter3": "4.0.4",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-core/node_modules/@types/node": {
- "version": "12.19.12",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/web3-eth": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "underscore": "1.9.1",
- "web3-core": "1.2.11",
- "web3-core-helpers": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-core-subscriptions": "1.2.11",
- "web3-eth-abi": "1.2.11",
- "web3-eth-accounts": "1.2.11",
- "web3-eth-contract": "1.2.11",
- "web3-eth-ens": "1.2.11",
- "web3-eth-iban": "1.2.11",
- "web3-eth-personal": "1.2.11",
- "web3-net": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-abi": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@ethersproject/abi": "5.0.0-beta.153",
- "underscore": "1.9.1",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-accounts": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "crypto-browserify": "3.12.0",
- "eth-lib": "0.2.8",
- "ethereumjs-common": "^1.3.2",
- "ethereumjs-tx": "^2.1.1",
- "scrypt-js": "^3.0.1",
- "underscore": "1.9.1",
- "uuid": "3.3.2",
- "web3-core": "1.2.11",
- "web3-core-helpers": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/eth-lib": {
- "version": "0.2.8",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/uuid": {
- "version": "3.3.2",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-contract": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@types/bn.js": "^4.11.5",
- "underscore": "1.9.1",
- "web3-core": "1.2.11",
- "web3-core-helpers": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-core-promievent": "1.2.11",
- "web3-core-subscriptions": "1.2.11",
- "web3-eth-abi": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-ens": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "content-hash": "^2.5.2",
- "eth-ens-namehash": "2.0.8",
- "underscore": "1.9.1",
- "web3-core": "1.2.11",
- "web3-core-helpers": "1.2.11",
- "web3-core-promievent": "1.2.11",
- "web3-eth-abi": "1.2.11",
- "web3-eth-contract": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-iban": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.11.9",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-personal": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "@types/node": "^12.12.6",
- "web3-core": "1.2.11",
- "web3-core-helpers": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-net": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-eth-personal/node_modules/@types/node": {
- "version": "12.19.12",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/web3-net": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "web3-core": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-utils": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine": {
- "version": "14.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async": "^2.5.0",
- "backoff": "^2.5.0",
- "clone": "^2.0.0",
- "cross-fetch": "^2.1.0",
- "eth-block-tracker": "^3.0.0",
- "eth-json-rpc-infura": "^3.1.0",
- "eth-sig-util": "3.0.0",
- "ethereumjs-block": "^1.2.2",
- "ethereumjs-tx": "^1.2.0",
- "ethereumjs-util": "^5.1.5",
- "ethereumjs-vm": "^2.3.4",
- "json-rpc-error": "^2.0.0",
- "json-stable-stringify": "^1.0.1",
- "promise-to-callback": "^1.0.0",
- "readable-stream": "^2.2.9",
- "request": "^2.85.0",
- "semaphore": "^1.0.3",
- "ws": "^5.1.1",
- "xhr": "^2.2.0",
- "xtend": "^4.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/abstract-leveldown": {
- "version": "2.6.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/deferred-leveldown": {
- "version": "1.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.6.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/eth-sig-util": {
- "version": "1.4.2",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
- "ethereumjs-util": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-account": {
- "version": "2.0.5",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-util": "^5.0.0",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block": {
- "version": "1.7.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereum-common": "0.2.0",
- "ethereumjs-tx": "^1.2.2",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block/node_modules/ethereum-common": {
- "version": "0.2.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-tx": {
- "version": "1.3.7",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereum-common": "^0.0.18",
- "ethereumjs-util": "^5.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm": {
- "version": "2.6.0",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.1.2",
- "async-eventemitter": "^0.2.2",
- "ethereumjs-account": "^2.0.3",
- "ethereumjs-block": "~2.2.0",
- "ethereumjs-common": "^1.1.0",
- "ethereumjs-util": "^6.0.0",
- "fake-merkle-patricia-tree": "^1.0.1",
- "functional-red-black-tree": "^1.0.1",
- "merkle-patricia-tree": "^2.3.2",
- "rustbn.js": "~0.2.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
- "version": "2.2.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^2.0.1",
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-tx": "^2.1.1",
- "ethereumjs-util": "^5.0.0",
- "merkle-patricia-tree": "^2.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
- "version": "5.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "^0.1.3",
- "rlp": "^2.0.0",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
- "version": "2.1.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "ethereumjs-common": "^1.5.0",
- "ethereumjs-util": "^6.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
- "version": "6.2.1",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "@types/bn.js": "^4.11.3",
- "bn.js": "^4.11.0",
- "create-hash": "^1.1.2",
- "elliptic": "^6.5.2",
- "ethereum-cryptography": "^0.1.3",
- "ethjs-util": "0.1.6",
- "rlp": "^2.2.3"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/isarray": {
- "version": "0.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-codec": {
- "version": "7.0.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-errors": {
- "version": "1.0.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "errno": "~0.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream": {
- "version": "1.3.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.1",
- "level-errors": "^1.0.3",
- "readable-stream": "^1.0.33",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream/node_modules/readable-stream": {
- "version": "1.1.14",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws": {
- "version": "0.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readable-stream": "~1.0.15",
- "xtend": "~2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/readable-stream": {
- "version": "1.0.34",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/xtend": {
- "version": "2.1.2",
- "dev": true,
- "dependencies": {
- "object-keys": "~0.4.0"
- },
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/levelup": {
- "version": "1.3.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deferred-leveldown": "~1.2.1",
- "level-codec": "~7.0.0",
- "level-errors": "~1.0.3",
- "level-iterator-stream": "~1.3.0",
- "prr": "~1.0.1",
- "semver": "~5.4.1",
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ltgt": {
- "version": "2.2.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown": {
- "version": "1.4.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "abstract-leveldown": "~2.7.1",
- "functional-red-black-tree": "^1.0.1",
- "immediate": "^3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "2.7.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xtend": "~4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree": {
- "version": "2.3.2",
- "dev": true,
- "license": "MPL-2.0",
- "dependencies": {
- "async": "^1.4.2",
- "ethereumjs-util": "^5.0.0",
- "level-ws": "0.0.0",
- "levelup": "^1.2.1",
- "memdown": "^1.0.0",
- "readable-stream": "^2.0.0",
- "rlp": "^2.0.0",
- "semaphore": ">=1.0.1"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree/node_modules/async": {
- "version": "1.5.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/object-keys": {
- "version": "0.4.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/semver": {
- "version": "5.4.1",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/string_decoder": {
- "version": "0.10.31",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ws": {
- "version": "5.2.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async-limiter": "~1.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-providers-http": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "web3-core-helpers": "1.2.11",
- "xhr2-cookies": "1.1.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-providers-ipc": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "oboe": "2.1.4",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-providers-ws": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "eventemitter3": "4.0.4",
- "underscore": "1.9.1",
- "web3-core-helpers": "1.2.11",
- "websocket": "^1.0.31"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-shh": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "web3-core": "1.2.11",
- "web3-core-method": "1.2.11",
- "web3-core-subscriptions": "1.2.11",
- "web3-net": "1.2.11"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-utils": {
- "version": "1.2.11",
- "dev": true,
- "license": "LGPL-3.0",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.11.9",
- "eth-lib": "0.2.8",
- "ethereum-bloom-filters": "^1.0.6",
- "ethjs-unit": "0.1.6",
- "number-to-bn": "1.7.0",
- "randombytes": "^2.1.0",
- "underscore": "1.9.1",
- "utf8": "3.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/web3-utils/node_modules/eth-lib": {
- "version": "0.2.8",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "bn.js": "^4.11.6",
- "elliptic": "^6.4.0",
- "xhr-request-promise": "^0.1.2"
- }
- },
- "node_modules/ganache-core/node_modules/websocket": {
- "version": "1.0.32",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "bufferutil": "^4.0.1",
- "debug": "^2.2.0",
- "es5-ext": "^0.10.50",
- "typedarray-to-buffer": "^3.1.5",
- "utf-8-validate": "^5.0.2",
- "yaeti": "^0.0.6"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/websocket/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/websocket/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/whatwg-fetch": {
- "version": "2.0.4",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ganache-core/node_modules/wrappy": {
- "version": "1.0.2",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ganache-core/node_modules/ws": {
- "version": "3.3.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "async-limiter": "~1.0.0",
- "safe-buffer": "~5.1.0",
- "ultron": "~1.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/ws/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/ganache-core/node_modules/xhr": {
- "version": "2.6.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "global": "~4.4.0",
- "is-function": "^1.0.1",
- "parse-headers": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ganache-core/node_modules/xhr-request": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "buffer-to-arraybuffer": "^0.0.5",
- "object-assign": "^4.1.1",
- "query-string": "^5.0.1",
- "simple-get": "^2.7.0",
- "timed-out": "^4.0.1",
- "url-set-query": "^1.0.0",
- "xhr": "^2.0.4"
- }
- },
- "node_modules/ganache-core/node_modules/xhr-request-promise": {
- "version": "0.1.3",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "xhr-request": "^1.1.0"
- }
- },
- "node_modules/ganache-core/node_modules/xhr2-cookies": {
- "version": "1.1.0",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "cookiejar": "^2.1.1"
- }
- },
- "node_modules/ganache-core/node_modules/xtend": {
- "version": "4.0.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/ganache-core/node_modules/yaeti": {
- "version": "0.0.6",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.32"
- }
- },
- "node_modules/ganache-core/node_modules/yallist": {
- "version": "3.1.1",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-package-type": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
- "dev": true,
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/ghost-testrpc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
- "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "chalk": "^2.4.2",
- "node-emoji": "^1.10.0"
- },
- "bin": {
- "testrpc-sc": "index.js"
- }
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/globby/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/handlebars": {
- "version": "4.7.8",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.2",
- "source-map": "^0.6.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "handlebars": "bin/handlebars"
- },
- "engines": {
- "node": ">=0.4.7"
- },
- "optionalDependencies": {
- "uglify-js": "^3.1.4"
- }
- },
- "node_modules/handlebars/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "deprecated": "this library is no longer supported",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/hardhat": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.0.tgz",
- "integrity": "sha512-TtWZ4mKOH5YA+PCDAGAjG7Gub2NA+egAX7RIHq5XnGrEALNXAbyP3S0I9vOE1MWCgZhn+XOFUNfDuHgkBOPoRw==",
- "dev": true,
- "dependencies": {
- "@ethersproject/abi": "^5.1.2",
- "@metamask/eth-sig-util": "^4.0.0",
- "@nomicfoundation/ethereumjs-block": "5.0.4",
- "@nomicfoundation/ethereumjs-blockchain": "7.0.4",
- "@nomicfoundation/ethereumjs-common": "4.0.4",
- "@nomicfoundation/ethereumjs-evm": "2.0.4",
- "@nomicfoundation/ethereumjs-rlp": "5.0.4",
- "@nomicfoundation/ethereumjs-statemanager": "2.0.4",
- "@nomicfoundation/ethereumjs-trie": "6.0.4",
- "@nomicfoundation/ethereumjs-tx": "5.0.4",
- "@nomicfoundation/ethereumjs-util": "9.0.4",
- "@nomicfoundation/ethereumjs-verkle": "0.0.2",
- "@nomicfoundation/ethereumjs-vm": "7.0.4",
- "@nomicfoundation/solidity-analyzer": "^0.1.0",
- "@sentry/node": "^5.18.1",
- "@types/bn.js": "^5.1.0",
- "@types/lru-cache": "^5.1.0",
- "adm-zip": "^0.4.16",
- "aggregate-error": "^3.0.0",
- "ansi-escapes": "^4.3.0",
- "boxen": "^5.1.2",
- "chalk": "^2.4.2",
- "chokidar": "^3.4.0",
- "ci-info": "^2.0.0",
- "debug": "^4.1.1",
- "enquirer": "^2.3.0",
- "env-paths": "^2.2.0",
- "ethereum-cryptography": "^1.0.3",
- "ethereumjs-abi": "^0.6.8",
- "find-up": "^2.1.0",
- "fp-ts": "1.19.3",
- "fs-extra": "^7.0.1",
- "glob": "7.2.0",
- "immutable": "^4.0.0-rc.12",
- "io-ts": "1.10.4",
- "keccak": "^3.0.2",
- "lodash": "^4.17.11",
- "mnemonist": "^0.38.0",
- "mocha": "^10.0.0",
- "p-map": "^4.0.0",
- "raw-body": "^2.4.1",
- "resolve": "1.17.0",
- "semver": "^6.3.0",
- "solc": "0.7.3",
- "source-map-support": "^0.5.13",
- "stacktrace-parser": "^0.1.10",
- "tsort": "0.0.1",
- "undici": "^5.14.0",
- "uuid": "^8.3.2",
- "ws": "^7.4.6"
- },
- "bin": {
- "hardhat": "internal/cli/bootstrap.js"
- },
- "peerDependencies": {
- "ts-node": "*",
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "ts-node": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/hardhat-dependency-compiler": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.1.3.tgz",
- "integrity": "sha512-bCDqsOxGST6WkbMvj4lPchYWidNSSBm5CFnkyAex1T11cGmr9otZTGl81W6f9pmrtBXbKCvr3OSuNJ6Q394sAw==",
- "dev": true,
- "engines": {
- "node": ">=14.14.0"
- },
- "peerDependencies": {
- "hardhat": "^2.0.0"
- }
- },
- "node_modules/hardhat-gas-reporter": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz",
- "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-uniq": "1.0.3",
- "eth-gas-reporter": "^0.2.25",
- "sha1": "^1.1.1"
- },
- "peerDependencies": {
- "hardhat": "^2.0.2"
- }
- },
- "node_modules/hardhat/node_modules/@noble/hashes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz",
- "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
- },
- "node_modules/hardhat/node_modules/@scure/bip32": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz",
- "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "@noble/hashes": "~1.2.0",
- "@noble/secp256k1": "~1.7.0",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/hardhat/node_modules/@scure/bip39": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz",
- "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "@noble/hashes": "~1.2.0",
- "@scure/base": "~1.1.0"
- }
- },
- "node_modules/hardhat/node_modules/ethereum-cryptography": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
- "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "1.2.0",
- "@noble/secp256k1": "1.7.1",
- "@scure/bip32": "1.1.5",
- "@scure/bip39": "1.1.1"
- }
- },
- "node_modules/hardhat/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/hardhat/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/hardhat/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hardhat/node_modules/resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "dependencies": {
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hardhat/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/hardhat/node_modules/solc": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz",
- "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==",
- "dev": true,
- "dependencies": {
- "command-exists": "^1.2.8",
- "commander": "3.0.2",
- "follow-redirects": "^1.12.1",
- "fs-extra": "^0.30.0",
- "js-sha3": "0.8.0",
- "memorystream": "^0.3.1",
- "require-from-string": "^2.0.0",
- "semver": "^5.5.0",
- "tmp": "0.0.33"
- },
- "bin": {
- "solcjs": "solcjs"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/hardhat/node_modules/solc/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/hardhat/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/hardhat/node_modules/ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "dev": true,
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/has": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true,
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/heap": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
- "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==",
- "dev": true,
- "peer": true
- },
- "node_modules/hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/http-basic": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
- "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "caseless": "^0.12.0",
- "concat-stream": "^1.6.2",
- "http-response-object": "^3.0.1",
- "parse-cache-control": "^1.0.1"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-response-object": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
- "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/node": "^10.0.3"
- }
- },
- "node_modules/http-response-object/node_modules/@types/node": {
- "version": "10.17.60",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
- "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
- "dev": true,
- "peer": true
- },
- "node_modules/http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/hyperlinker": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz",
- "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/idna-uts46-hx": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
- "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==",
- "dev": true,
- "dependencies": {
- "punycode": "2.1.0"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/immediate": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
- "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
- "dev": true
- },
- "node_modules/immutable": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz",
- "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==",
- "dev": true
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true,
- "peer": true
- },
- "node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/io-ts": {
- "version": "1.10.4",
- "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz",
- "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==",
- "dev": true,
- "dependencies": {
- "fp-ts": "^1.0.0"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
- "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hex-prefixed": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
- "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
- "dev": true,
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
- "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
- "dev": true,
- "dependencies": {
- "which-typed-array": "^1.1.11"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-url": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
- "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
- "dev": true
- },
- "node_modules/is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
- "dev": true
- },
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/isomorphic-unfetch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz",
- "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==",
- "dev": true,
- "dependencies": {
- "node-fetch": "^2.6.1",
- "unfetch": "^4.2.0"
- }
- },
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
- "node_modules/jake": {
- "version": "10.8.7",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
- "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
- "dev": true,
- "dependencies": {
- "async": "^3.2.3",
- "chalk": "^4.0.2",
- "filelist": "^1.0.4",
- "minimatch": "^3.1.2"
- },
- "bin": {
- "jake": "bin/cli.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/jake/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jake/node_modules/async": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
- "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
- "dev": true
- },
- "node_modules/jake/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/jake/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/jake/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/jake/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jake/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/js-cookie": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
- "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
- "dev": true
- },
- "node_modules/js-sdsl": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz",
- "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/js-sdsl"
- }
- },
- "node_modules/js-sha3": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
- "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
- "dev": true
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "dev": true
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/jsonschema": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
- "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/keccak": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
- "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/keccak/node_modules/node-addon-api": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
- "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
- "dev": true
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/klaw": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
- "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.9"
- }
- },
- "node_modules/klaw-sync": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
- "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.11"
- }
- },
- "node_modules/lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
- "dev": true,
- "dependencies": {
- "invert-kv": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/level-codec": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
- "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
- "dev": true,
- "dependencies": {
- "buffer": "^5.6.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-codec/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/level-concat-iterator": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
- "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-errors": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
- "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
- "dev": true,
- "dependencies": {
- "errno": "~0.1.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-iterator-stream": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
- "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0",
- "xtend": "^4.0.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-mem": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz",
- "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==",
- "dev": true,
- "dependencies": {
- "level-packager": "^5.0.3",
- "memdown": "^5.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-packager": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz",
- "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==",
- "dev": true,
- "dependencies": {
- "encoding-down": "^6.3.0",
- "levelup": "^4.3.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/level-ws": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz",
- "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.0",
- "xtend": "^4.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/levelup": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
- "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
- "dev": true,
- "dependencies": {
- "deferred-leveldown": "~5.3.0",
- "level-errors": "~2.0.0",
- "level-iterator-stream": "~4.0.0",
- "level-supports": "~1.0.0",
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/levelup/node_modules/level-supports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
- "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/load-json-file": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
- "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/load-json-file/node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/load-json-file/node_modules/strip-bom": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
- "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
- "dev": true,
- "dependencies": {
- "is-utf8": "^0.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
- "node_modules/lodash.assign": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
- "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==",
- "dev": true
- },
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
- },
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
- "dev": true,
- "peer": true
- },
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/log-symbols/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/log-symbols/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/log-symbols/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "get-func-name": "^2.0.1"
- }
- },
- "node_modules/lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
- "dev": true
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/ltgt": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
- "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==",
- "dev": true
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true,
- "peer": true
- },
- "node_modules/mcl-wasm": {
- "version": "0.7.9",
- "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz",
- "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==",
- "dev": true,
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/memdown": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz",
- "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==",
- "dev": true,
- "dependencies": {
- "abstract-leveldown": "~6.2.1",
- "functional-red-black-tree": "~1.0.1",
- "immediate": "~3.2.3",
- "inherits": "~2.0.1",
- "ltgt": "~2.2.0",
- "safe-buffer": "~5.2.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/memdown/node_modules/abstract-leveldown": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
- "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
- "dev": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "immediate": "^3.2.3",
- "level-concat-iterator": "~2.0.0",
- "level-supports": "~1.0.0",
- "xtend": "~4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/memdown/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/memdown/node_modules/immediate": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
- "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==",
- "dev": true
- },
- "node_modules/memdown/node_modules/level-supports": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
- "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.2"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/memorystream": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
- "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
- "dev": true,
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/merkle-patricia-tree": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz",
- "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==",
- "dev": true,
- "dependencies": {
- "@types/levelup": "^4.3.0",
- "ethereumjs-util": "^7.1.4",
- "level-mem": "^5.0.1",
- "level-ws": "^2.0.0",
- "readable-stream": "^3.6.0",
- "semaphore-async-await": "^1.5.1"
- }
- },
- "node_modules/micro-ftch": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz",
- "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==",
- "dev": true
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- },
- "bin": {
- "miller-rabin": "bin/miller-rabin"
- }
- },
- "node_modules/miller-rabin/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/mnemonist": {
- "version": "0.38.5",
- "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz",
- "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==",
- "dev": true,
- "dependencies": {
- "obliterator": "^2.0.0"
- }
- },
- "node_modules/mocha": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
- "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
- "dev": true,
- "dependencies": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.4",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "7.2.0",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "5.0.1",
- "ms": "2.1.3",
- "nanoid": "3.3.3",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "workerpool": "6.2.1",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
- },
- "engines": {
- "node": ">= 14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mochajs"
- }
- },
- "node_modules/mocha/node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/mocha/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/mocha/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mocha/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/mocha/node_modules/minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/mocha/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/mocha/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/nanoassert": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
- "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
- "dev": true
- },
- "node_modules/nanoid": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
- "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
- "dev": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/natural-orderby": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz",
- "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "node_modules/node-addon-api": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
- "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
- "dev": true
- },
- "node_modules/node-emoji": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
- "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lodash": "^4.17.21"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-gyp-build": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz",
- "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==",
- "dev": true,
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/nofilter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
- "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
- "dev": true,
- "engines": {
- "node": ">=12.19"
- }
- },
- "node_modules/nopt": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/normalize-package-data/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/number-to-bn": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
- "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
- "dev": true,
- "dependencies": {
- "bn.js": "4.11.6",
- "strip-hex-prefix": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/number-to-bn/node_modules/bn.js": {
- "version": "4.11.6",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
- "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
- "dev": true
- },
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz",
- "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object-treeify": {
- "version": "1.1.33",
- "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz",
- "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.groupby": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
- "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obliterator": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
- "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==",
- "dev": true
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/open": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
- "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0",
- "is-wsl": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dev": true,
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/ordinal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz",
- "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
- "dev": true,
- "dependencies": {
- "lcid": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/packet-reader": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
- "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==",
- "dev": true
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-cache-control": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
- "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
- "dev": true,
- "peer": true
- },
- "node_modules/parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
- "dev": true,
- "dependencies": {
- "error-ex": "^1.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/password-prompt": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz",
- "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==",
- "dev": true,
- "dependencies": {
- "ansi-escapes": "^4.3.2",
- "cross-spawn": "^7.0.3"
- }
- },
- "node_modules/patch-package": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz",
- "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==",
- "dev": true,
- "dependencies": {
- "@yarnpkg/lockfile": "^1.1.0",
- "chalk": "^4.1.2",
- "cross-spawn": "^6.0.5",
- "find-yarn-workspace-root": "^2.0.0",
- "fs-extra": "^9.0.0",
- "is-ci": "^2.0.0",
- "klaw-sync": "^6.0.0",
- "minimist": "^1.2.6",
- "open": "^7.4.2",
- "rimraf": "^2.6.3",
- "semver": "^5.6.0",
- "slash": "^2.0.0",
- "tmp": "^0.0.33",
- "yaml": "^1.10.2"
- },
- "bin": {
- "patch-package": "index.js"
- },
- "engines": {
- "node": ">=10",
- "npm": ">5"
- }
- },
- "node_modules/patch-package/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/patch-package/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/patch-package/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/patch-package/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/patch-package/node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
- }
- },
- "node_modules/patch-package/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/patch-package/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/patch-package/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/patch-package/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/patch-package/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/patch-package/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/patch-package/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/patch-package/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/path-browserify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
- "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
- "dev": true
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
- "dev": true,
- "dependencies": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- },
- "engines": {
- "node": ">=0.12"
- }
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
- "node_modules/pg": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz",
- "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==",
- "dev": true,
- "dependencies": {
- "buffer-writer": "2.0.0",
- "packet-reader": "1.0.0",
- "pg-connection-string": "^2.6.2",
- "pg-pool": "^3.6.1",
- "pg-protocol": "^1.6.0",
- "pg-types": "^2.1.0",
- "pgpass": "1.x"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "optionalDependencies": {
- "pg-cloudflare": "^1.1.1"
- },
- "peerDependencies": {
- "pg-native": ">=3.0.1"
- },
- "peerDependenciesMeta": {
- "pg-native": {
- "optional": true
- }
- }
- },
- "node_modules/pg-cloudflare": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
- "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
- "dev": true,
- "optional": true
- },
- "node_modules/pg-connection-string": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
- "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==",
- "dev": true
- },
- "node_modules/pg-int8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/pg-pool": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz",
- "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==",
- "dev": true,
- "peerDependencies": {
- "pg": ">=8.0"
- }
- },
- "node_modules/pg-protocol": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
- "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==",
- "dev": true
- },
- "node_modules/pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
- "dev": true,
- "dependencies": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pgpass": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
- "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
- "dev": true,
- "dependencies": {
- "split2": "^4.1.0"
- }
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
- "dev": true,
- "dependencies": {
- "pinkie": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postinstall-postinstall": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz",
- "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==",
- "dev": true,
- "hasInstallScript": true
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
- "dev": true,
- "bin": {
- "prettier": "bin-prettier.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-plugin-solidity": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz",
- "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==",
- "dev": true,
- "dependencies": {
- "@solidity-parser/parser": "^0.16.0",
- "semver": "^7.3.8",
- "solidity-comments-extractor": "^0.0.7"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "prettier": ">=2.3.0 || >=3.0.0-alpha.0"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz",
- "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==",
- "dev": true,
- "dependencies": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/prettier-plugin-solidity/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true,
- "peer": true
- },
- "node_modules/promise": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "asap": "~2.0.6"
- }
- },
- "node_modules/proper-lockfile": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
- "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "retry": "^0.12.0",
- "signal-exit": "^3.0.2"
- }
- },
- "node_modules/proper-lockfile/node_modules/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "dev": true
- },
- "node_modules/prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "dev": true
- },
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
- "node_modules/punycode": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
- "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/ramda": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
- "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
- "dev": true
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "dev": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
- "dev": true,
- "dependencies": {
- "load-json-file": "^1.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
- "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
- "dev": true,
- "dependencies": {
- "find-up": "^1.0.0",
- "read-pkg": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up/node_modules/find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
- "dev": true,
- "dependencies": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg-up/node_modules/path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
- "dev": true,
- "dependencies": {
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg/node_modules/path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/read-pkg/node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/redeyed": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
- "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
- "dev": true,
- "dependencies": {
- "esprima": "~4.0.0"
- }
- },
- "node_modules/redeyed/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reduce-flatten": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
- "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
- "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "set-function-name": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/req-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
- "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "req-from": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/req-from": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
- "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "resolve-from": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/req-from/node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/request/node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/request/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "dev": true,
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==",
- "dev": true
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "dev": true,
- "dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "node_modules/rlp": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
- "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.2.0"
- },
- "bin": {
- "rlp": "bin/rlp"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/rust-verkle-wasm": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz",
- "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==",
- "dev": true
- },
- "node_modules/rustbn-wasm": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz",
- "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==",
- "dev": true,
- "dependencies": {
- "@scure/base": "^1.1.1"
- }
- },
- "node_modules/rustbn.js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz",
- "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==",
- "dev": true
- },
- "node_modules/safe-array-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
- "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "isarray": "^2.0.5"
- },
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safe-array-concat/node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "node_modules/sc-istanbul": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz",
- "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "abbrev": "1.0.x",
- "async": "1.x",
- "escodegen": "1.8.x",
- "esprima": "2.7.x",
- "glob": "^5.0.15",
- "handlebars": "^4.0.1",
- "js-yaml": "3.x",
- "mkdirp": "0.5.x",
- "nopt": "3.x",
- "once": "1.x",
- "resolve": "1.1.x",
- "supports-color": "^3.1.0",
- "which": "^1.1.1",
- "wordwrap": "^1.0.0"
- },
- "bin": {
- "istanbul": "lib/cli.js"
- }
- },
- "node_modules/sc-istanbul/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/sc-istanbul/node_modules/async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
- "dev": true,
- "peer": true
- },
- "node_modules/sc-istanbul/node_modules/glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/sc-istanbul/node_modules/has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sc-istanbul/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "peer": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/sc-istanbul/node_modules/resolve": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
- "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
- "dev": true,
- "peer": true
- },
- "node_modules/sc-istanbul/node_modules/supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^1.0.0"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/sc-istanbul/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/scrypt-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
- "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
- "dev": true
- },
- "node_modules/secp256k1": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz",
- "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "elliptic": "^6.5.4",
- "node-addon-api": "^2.0.0",
- "node-gyp-build": "^4.2.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/secp256k1/node_modules/node-addon-api": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
- "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
- "dev": true
- },
- "node_modules/semaphore-async-await": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz",
- "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==",
- "dev": true,
- "engines": {
- "node": ">=4.1"
- }
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
- "dev": true,
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
- },
- "node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
- "dev": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- },
- "bin": {
- "sha.js": "bin.js"
- }
- },
- "node_modules/sha1": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
- "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "charenc": ">= 0.0.1",
- "crypt": ">= 0.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- },
- "bin": {
- "shjs": "bin/shjs"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/solc": {
- "version": "0.6.12",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz",
- "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==",
- "dev": true,
- "dependencies": {
- "command-exists": "^1.2.8",
- "commander": "3.0.2",
- "fs-extra": "^0.30.0",
- "js-sha3": "0.8.0",
- "memorystream": "^0.3.1",
- "require-from-string": "^2.0.0",
- "semver": "^5.5.0",
- "tmp": "0.0.33"
- },
- "bin": {
- "solcjs": "solcjs"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/solc-0.8": {
- "name": "solc",
- "version": "0.8.20",
- "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz",
- "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==",
- "dev": true,
- "dependencies": {
- "command-exists": "^1.2.8",
- "commander": "^8.1.0",
- "follow-redirects": "^1.12.1",
- "js-sha3": "0.8.0",
- "memorystream": "^0.3.1",
- "semver": "^5.5.0",
- "tmp": "0.0.33"
- },
- "bin": {
- "solcjs": "solc.js"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/solc-0.8/node_modules/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "dev": true,
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/solc-0.8/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/solc/node_modules/fs-extra": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
- "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^2.1.0",
- "klaw": "^1.0.0",
- "path-is-absolute": "^1.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "node_modules/solc/node_modules/jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/solc/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/solc/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/solidity-ast": {
- "version": "0.4.55",
- "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.55.tgz",
- "integrity": "sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==",
- "dev": true,
- "dependencies": {
- "array.prototype.findlast": "^1.2.2"
- }
- },
- "node_modules/solidity-comments-extractor": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz",
- "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==",
- "dev": true
- },
- "node_modules/solidity-coverage": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz",
- "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@ethersproject/abi": "^5.0.9",
- "@solidity-parser/parser": "^0.16.0",
- "chalk": "^2.4.2",
- "death": "^1.1.0",
- "detect-port": "^1.3.0",
- "difflib": "^0.2.4",
- "fs-extra": "^8.1.0",
- "ghost-testrpc": "^0.0.2",
- "global-modules": "^2.0.0",
- "globby": "^10.0.1",
- "jsonschema": "^1.2.4",
- "lodash": "^4.17.15",
- "mocha": "10.2.0",
- "node-emoji": "^1.10.0",
- "pify": "^4.0.1",
- "recursive-readdir": "^2.2.2",
- "sc-istanbul": "^0.4.5",
- "semver": "^7.3.4",
- "shelljs": "^0.8.3",
- "web3-utils": "^1.3.6"
- },
- "bin": {
- "solidity-coverage": "plugins/bin.js"
- },
- "peerDependencies": {
- "hardhat": "^2.11.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz",
- "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "antlr4ts": "^0.5.0-alpha.4"
- }
- },
- "node_modules/solidity-coverage/node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/solidity-coverage/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "peer": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/solidity-coverage/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-coverage/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-coverage/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/solidity-coverage/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "peer": true
- },
- "node_modules/solidity-docgen": {
- "version": "0.5.17",
- "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz",
- "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==",
- "dev": true,
- "dependencies": {
- "@oclif/command": "^1.8.0",
- "@oclif/config": "^1.17.0",
- "@oclif/errors": "^1.3.3",
- "@oclif/plugin-help": "^5.0.0",
- "globby": "^11.0.0",
- "handlebars": "^4.7.6",
- "json5": "^2.1.3",
- "lodash": "^4.17.15",
- "micromatch": "^4.0.2",
- "minimatch": "^5.0.0",
- "semver": "^7.3.2",
- "solc": "^0.6.7"
- },
- "bin": {
- "solidity-docgen": "dist/cli.js"
- }
- },
- "node_modules/solidity-docgen/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/solidity-docgen/node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/solidity-docgen/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-docgen/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-docgen/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/solidity-docgen/node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/solidity-docgen/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/source-map": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
- "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "amdefine": ">=0.0.4"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.16",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
- "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
- "dev": true
- },
- "node_modules/split2": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
- "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
- "dev": true,
- "engines": {
- "node": ">= 10.x"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "node_modules/sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
- "dev": true,
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/sshpk/node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
- "node_modules/stacktrace-parser": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
- "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.7.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/stacktrace-parser/node_modules/type-fest": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
- "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-format": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz",
- "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==",
- "dev": true,
- "peer": true
- },
- "node_modules/string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string.prototype.trim": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
- "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
- "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
- "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-hex-prefix": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
- "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
- "dev": true,
- "dependencies": {
- "is-hex-prefixed": "1.0.0"
- },
- "engines": {
- "node": ">=6.5.0",
- "npm": ">=3"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/supports-hyperlinks": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
- "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/sync-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
- "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "http-response-object": "^3.0.1",
- "sync-rpc": "^1.2.1",
- "then-request": "^6.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/sync-rpc": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
- "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "get-port": "^3.1.0"
- }
- },
- "node_modules/table": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
- "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/table-layout": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
- "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "array-back": "^4.0.1",
- "deep-extend": "~0.6.0",
- "typical": "^5.2.0",
- "wordwrapjs": "^4.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/table-layout/node_modules/array-back": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
- "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/table-layout/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/table/node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/table/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "peer": true
- },
- "node_modules/table/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/test-value": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
- "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
- "dev": true,
- "dependencies": {
- "array-back": "^1.0.3",
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/test-value/node_modules/array-back": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
- "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
- "dev": true,
- "dependencies": {
- "typical": "^2.6.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/test-value/node_modules/typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
- "dev": true
- },
- "node_modules/testrpc": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz",
- "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==",
- "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.",
- "dev": true
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "node_modules/then-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
- "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/concat-stream": "^1.6.0",
- "@types/form-data": "0.0.33",
- "@types/node": "^8.0.0",
- "@types/qs": "^6.2.31",
- "caseless": "~0.12.0",
- "concat-stream": "^1.6.0",
- "form-data": "^2.2.0",
- "http-basic": "^8.1.1",
- "http-response-object": "^3.0.1",
- "promise": "^8.0.0",
- "qs": "^6.4.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/then-request/node_modules/@types/node": {
- "version": "8.10.66",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
- "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
- "dev": true,
- "peer": true
- },
- "node_modules/then-request/node_modules/form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dev": true,
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/tough-cookie/node_modules/punycode": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true
- },
- "node_modules/ts-command-line-args": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz",
- "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "chalk": "^4.1.0",
- "command-line-args": "^5.1.1",
- "command-line-usage": "^6.1.0",
- "string-format": "^2.0.0"
- },
- "bin": {
- "write-markdown": "dist/write-markdown.js"
- }
- },
- "node_modules/ts-command-line-args/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ts-command-line-args/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/ts-command-line-args/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/ts-command-line-args/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/ts-command-line-args/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ts-command-line-args/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ts-essentials": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz",
- "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==",
- "dev": true,
- "peer": true,
- "peerDependencies": {
- "typescript": ">=3.7.0"
- }
- },
- "node_modules/ts-generator": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz",
- "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==",
- "dev": true,
- "dependencies": {
- "@types/mkdirp": "^0.5.2",
- "@types/prettier": "^2.1.1",
- "@types/resolve": "^0.0.8",
- "chalk": "^2.4.1",
- "glob": "^7.1.2",
- "mkdirp": "^0.5.1",
- "prettier": "^2.1.2",
- "resolve": "^1.8.1",
- "ts-essentials": "^1.0.0"
- },
- "bin": {
- "ts-generator": "dist/cli/run.js"
- }
- },
- "node_modules/ts-generator/node_modules/ts-essentials": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz",
- "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==",
- "dev": true
- },
- "node_modules/ts-node": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
- "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
- "dev": true,
- "dependencies": {
- "@cspotcode/source-map-support": "^0.8.0",
- "@tsconfig/node10": "^1.0.7",
- "@tsconfig/node12": "^1.0.7",
- "@tsconfig/node14": "^1.0.0",
- "@tsconfig/node16": "^1.0.2",
- "acorn": "^8.4.1",
- "acorn-walk": "^8.1.1",
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "v8-compile-cache-lib": "^3.0.1",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-cwd": "dist/bin-cwd.js",
- "ts-node-esm": "dist/bin-esm.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
- "peerDependencies": {
- "@swc/core": ">=1.2.50",
- "@swc/wasm": ">=1.2.50",
- "@types/node": "*",
- "typescript": ">=2.7"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "@swc/wasm": {
- "optional": true
- }
- }
- },
- "node_modules/ts-node/node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/tsconfig-paths": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
- "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/tsort": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz",
- "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==",
- "dev": true
- },
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
- "dev": true
- },
- "node_modules/tweetnacl-util": {
- "version": "0.15.1",
- "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
- "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
- "dev": true
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typechain": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz",
- "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@types/prettier": "^2.1.1",
- "debug": "^4.3.1",
- "fs-extra": "^7.0.0",
- "glob": "7.1.7",
- "js-sha3": "^0.8.0",
- "lodash": "^4.17.15",
- "mkdirp": "^1.0.4",
- "prettier": "^2.3.1",
- "ts-command-line-args": "^2.2.0",
- "ts-essentials": "^7.0.1"
- },
- "bin": {
- "typechain": "dist/cli/cli.js"
- },
- "peerDependencies": {
- "typescript": ">=4.3.0"
- }
- },
- "node_modules/typechain/node_modules/fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/typechain/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/typechain/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "peer": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/typechain/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "peer": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/typechain/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/typed-array-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
- "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/typed-array-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
- "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "dev": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
- "dev": true,
- "optional": true,
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undici": {
- "version": "5.26.3",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz",
- "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==",
- "dev": true,
- "dependencies": {
- "@fastify/busboy": "^2.0.0"
- },
- "engines": {
- "node": ">=14.0"
- }
- },
- "node_modules/undici-types": {
- "version": "5.25.3",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
- "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==",
- "dev": true
- },
- "node_modules/unfetch": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
- "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==",
- "dev": true
- },
- "node_modules/universalify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
- "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/url": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz",
- "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==",
- "dev": true,
- "dependencies": {
- "punycode": "^1.4.1",
- "qs": "^6.11.2"
- }
- },
- "node_modules/url/node_modules/punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
- "node_modules/url/node_modules/qs": {
- "version": "6.11.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
- "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/utf8": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
- "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
- "dev": true
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/v8-compile-cache-lib": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
- "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
- "dev": true
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/wasmbuilder": {
- "version": "0.0.16",
- "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
- "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==",
- "dev": true
- },
- "node_modules/wasmcurves": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz",
- "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==",
- "dev": true,
- "dependencies": {
- "wasmbuilder": "0.0.16"
- }
- },
- "node_modules/web-worker": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
- "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==",
- "dev": true
- },
- "node_modules/web3-utils": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz",
- "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==",
- "dev": true,
- "dependencies": {
- "@ethereumjs/util": "^8.1.0",
- "bn.js": "^5.2.1",
- "ethereum-bloom-filters": "^1.0.6",
- "ethereum-cryptography": "^2.1.2",
- "ethjs-unit": "0.1.6",
- "number-to-bn": "1.7.0",
- "randombytes": "^2.1.0",
- "utf8": "3.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/web3-utils/node_modules/@noble/curves": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz",
- "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==",
- "dev": true,
- "dependencies": {
- "@noble/hashes": "1.3.1"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/web3-utils/node_modules/@noble/hashes": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz",
- "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==",
- "dev": true,
- "engines": {
- "node": ">= 16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/web3-utils/node_modules/ethereum-cryptography": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz",
- "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==",
- "dev": true,
- "dependencies": {
- "@noble/curves": "1.1.0",
- "@noble/hashes": "1.3.1",
- "@scure/bip32": "1.3.1",
- "@scure/bip39": "1.2.1"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==",
- "dev": true
- },
- "node_modules/which-typed-array": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
- "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/widest-line/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/window-size": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
- "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==",
- "dev": true,
- "bin": {
- "window-size": "cli.js"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true
- },
- "node_modules/wordwrapjs": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
- "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "reduce-flatten": "^2.0.0",
- "typical": "^5.2.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/wordwrapjs/node_modules/typical": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
- "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
- "dev": true
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/wrap-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/wrap-ansi/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
- },
- "node_modules/ws": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
- "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
+ "name": "@0xpolygonhermez/zkevm-contracts",
+ "version": "3.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@0xpolygonhermez/zkevm-contracts",
+ "version": "3.0.0",
+ "license": "pending",
+ "devDependencies": {
+ "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#v8.0.0-fork.12",
+ "@nomicfoundation/hardhat-toolbox": "^3.0.0",
+ "@openzeppelin/contracts": "4.8.2",
+ "@openzeppelin/contracts-upgradeable": "4.8.2",
+ "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@5.0.0",
+ "@openzeppelin/hardhat-upgrades": "^2.5.1",
+ "@types/yargs": "^17.0.28",
+ "circomlibjs": "0.1.1",
+ "dotenv": "^8.6.0",
+ "eslint": "^8.51.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-plugin-mocha": "^9.0.0",
+ "ethereum-waffle": "^3.4.4",
+ "ffjavascript": "^0.2.60",
+ "hardhat": "^2.22.3",
+ "hardhat-dependency-compiler": "^1.1.3",
+ "hardhat-switch-network": "^1.2.0",
+ "lodash": "^4.17.21",
+ "prettier": "^2.8.8",
+ "prettier-plugin-solidity": "^1.4.1",
+ "shelljs": "^0.8.5",
+ "solc-0.8": "npm:solc@0.8.20",
+ "solc-0.8.17": "npm:solc@0.8.17",
+ "solidity-docgen": "^0.5.17",
+ "winston": "^3.17.0"
+ }
+ },
+ "node_modules/@0xpolygonhermez/zkevm-commonjs": {
+ "version": "5.0.0",
+ "resolved": "git+ssh://git@github.com/0xPolygonHermez/zkevm-commonjs.git#bb0e77e9158a0fc3d06eb5de53b458bb87f77bc7",
+ "dev": true,
+ "license": "pending",
+ "dependencies": {
+ "@ethereumjs/block": "^3.6.2",
+ "@ethereumjs/tx": "^3.4.0",
+ "@polygon-hermez/common": "2.6.4",
+ "@polygon-hermez/vm": "6.0.13",
+ "ethereumjs-util": "^7.1.4",
+ "ethers": "^5.5.4",
+ "ffjavascript": "^0.2.55",
+ "lodash": "^4.17.21",
+ "pg": "^8.7.1"
+ }
+ },
+ "node_modules/@0xpolygonhermez/zkevm-commonjs/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@adraffy/ens-normalize": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz",
+ "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz",
+ "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==",
+ "dev": true,
+ "dependencies": {
+ "@aws-crypto/util": "^1.2.2",
+ "@aws-sdk/types": "^3.1.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz",
+ "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==",
+ "dev": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.1.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.679.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.679.0.tgz",
+ "integrity": "sha512-NwVq8YvInxQdJ47+zz4fH3BRRLC6lL+WLkvr242PVBbUOLRyK/lkwHlfiKUoeVIMyK5NF+up6TRg71t/8Bny6Q==",
+ "dev": true,
+ "dependencies": {
+ "@smithy/types": "^3.5.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+ "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "dev": true,
+ "dependencies": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@ensdomains/ens": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz",
+ "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==",
+ "deprecated": "Please use @ensdomains/ens-contracts",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.5.2",
+ "eth-ens-namehash": "^2.0.8",
+ "solc": "^0.4.20",
+ "testrpc": "0.0.1",
+ "web3-utils": "^1.0.0-beta.31"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/fs-extra": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+ "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "dev": true,
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/require-from-string": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+ "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/solc": {
+ "version": "0.4.26",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz",
+ "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==",
+ "dev": true,
+ "dependencies": {
+ "fs-extra": "^0.30.0",
+ "memorystream": "^0.3.1",
+ "require-from-string": "^1.1.0",
+ "semver": "^5.3.0",
+ "yargs": "^4.7.1"
+ },
+ "bin": {
+ "solcjs": "solcjs"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+ "dev": true,
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/y18n": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
+ "dev": true
+ },
+ "node_modules/@ensdomains/ens/node_modules/yargs": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
+ "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "lodash.assign": "^4.0.3",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.1",
+ "which-module": "^1.0.0",
+ "window-size": "^0.2.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^2.4.1"
+ }
+ },
+ "node_modules/@ensdomains/ens/node_modules/yargs-parser": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
+ "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^3.0.0",
+ "lodash.assign": "^4.0.6"
+ }
+ },
+ "node_modules/@ensdomains/resolver": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz",
+ "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==",
+ "deprecated": "Please use @ensdomains/ens-contracts",
+ "dev": true
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/chai": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-3.4.4.tgz",
+ "integrity": "sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==",
+ "dev": true,
+ "dependencies": {
+ "@ethereum-waffle/provider": "^3.4.4",
+ "ethers": "^5.5.2"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/chai/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz",
+ "integrity": "sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==",
+ "dev": true,
+ "dependencies": {
+ "@resolver-engine/imports": "^0.3.3",
+ "@resolver-engine/imports-fs": "^0.3.3",
+ "@typechain/ethers-v5": "^2.0.0",
+ "@types/mkdirp": "^0.5.2",
+ "@types/node-fetch": "^2.5.5",
+ "ethers": "^5.0.1",
+ "mkdirp": "^0.5.1",
+ "node-fetch": "^2.6.1",
+ "solc": "^0.6.3",
+ "ts-generator": "^0.1.1",
+ "typechain": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz",
+ "integrity": "sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==",
+ "dev": true,
+ "dependencies": {
+ "ethers": "^5.0.2"
+ },
+ "peerDependencies": {
+ "ethers": "^5.0.0",
+ "typechain": "^3.0.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/array-back": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
+ "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "dev": true,
+ "dependencies": {
+ "typical": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/command-line-args": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz",
+ "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==",
+ "dev": true,
+ "dependencies": {
+ "array-back": "^2.0.0",
+ "find-replace": "^1.0.3",
+ "typical": "^2.6.1"
+ },
+ "bin": {
+ "command-line-args": "bin/cli.js"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/find-replace": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+ "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==",
+ "dev": true,
+ "dependencies": {
+ "array-back": "^1.0.4",
+ "test-value": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/find-replace/node_modules/array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
+ "dev": true,
+ "dependencies": {
+ "typical": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/ts-essentials": {
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-6.0.7.tgz",
+ "integrity": "sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==",
+ "dev": true,
+ "peerDependencies": {
+ "typescript": ">=3.7.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/typechain": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/typechain/-/typechain-3.0.0.tgz",
+ "integrity": "sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==",
+ "dev": true,
+ "dependencies": {
+ "command-line-args": "^4.0.7",
+ "debug": "^4.1.1",
+ "fs-extra": "^7.0.0",
+ "js-sha3": "^0.8.0",
+ "lodash": "^4.17.15",
+ "ts-essentials": "^6.0.3",
+ "ts-generator": "^0.1.1"
+ },
+ "bin": {
+ "typechain": "dist/cli/cli.js"
+ }
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
+ "dev": true
+ },
+ "node_modules/@ethereum-waffle/compiler/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/ens": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-3.4.4.tgz",
+ "integrity": "sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==",
+ "dev": true,
+ "dependencies": {
+ "@ensdomains/ens": "^0.4.4",
+ "@ensdomains/resolver": "^0.2.4",
+ "ethers": "^5.5.2"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/ens/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/mock-contract": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-3.4.4.tgz",
+ "integrity": "sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.5.0",
+ "ethers": "^5.5.2"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/mock-contract/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/provider": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-3.4.4.tgz",
+ "integrity": "sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==",
+ "dev": true,
+ "dependencies": {
+ "@ethereum-waffle/ens": "^3.4.4",
+ "ethers": "^5.5.2",
+ "ganache-core": "^2.13.2",
+ "patch-package": "^6.2.2",
+ "postinstall-postinstall": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/@ethereum-waffle/provider/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@ethereumjs/block": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz",
+ "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/common": "^2.6.5",
+ "@ethereumjs/tx": "^3.5.2",
+ "ethereumjs-util": "^7.1.5",
+ "merkle-patricia-tree": "^4.2.4"
+ }
+ },
+ "node_modules/@ethereumjs/blockchain": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz",
+ "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/block": "^3.6.2",
+ "@ethereumjs/common": "^2.6.4",
+ "@ethereumjs/ethash": "^1.1.0",
+ "debug": "^4.3.3",
+ "ethereumjs-util": "^7.1.5",
+ "level-mem": "^5.0.1",
+ "lru-cache": "^5.1.1",
+ "semaphore-async-await": "^1.5.1"
+ }
+ },
+ "node_modules/@ethereumjs/common": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz",
+ "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==",
+ "dev": true,
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "ethereumjs-util": "^7.1.5"
+ }
+ },
+ "node_modules/@ethereumjs/ethash": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz",
+ "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/block": "^3.5.0",
+ "@types/levelup": "^4.3.0",
+ "buffer-xor": "^2.0.1",
+ "ethereumjs-util": "^7.1.1",
+ "miller-rabin": "^4.0.0"
+ }
+ },
+ "node_modules/@ethereumjs/rlp": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz",
+ "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==",
+ "dev": true,
+ "bin": {
+ "rlp": "bin/rlp"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/tx": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz",
+ "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/common": "^2.6.4",
+ "ethereumjs-util": "^7.1.5"
+ }
+ },
+ "node_modules/@ethereumjs/util": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz",
+ "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/rlp": "^4.0.1",
+ "ethereum-cryptography": "^2.0.0",
+ "micro-ftch": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/util/node_modules/@noble/curves": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
+ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.4.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@ethereumjs/util/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz",
+ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.4.2",
+ "@noble/hashes": "1.4.0",
+ "@scure/bip32": "1.4.0",
+ "@scure/bip39": "1.3.0"
+ }
+ },
+ "node_modules/@ethersproject/abi": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz",
+ "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-provider": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz",
+ "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/abstract-signer": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz",
+ "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/address": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz",
+ "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/base64": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz",
+ "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/basex": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz",
+ "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/bignumber": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz",
+ "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "bn.js": "^5.2.1"
+ }
+ },
+ "node_modules/@ethersproject/bytes": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz",
+ "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/constants": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz",
+ "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/contracts": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz",
+ "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "^5.7.0",
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/hash": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz",
+ "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/hdnode": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz",
+ "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/json-wallets": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz",
+ "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/pbkdf2": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "aes-js": "3.0.0",
+ "scrypt-js": "3.0.1"
+ }
+ },
+ "node_modules/@ethersproject/json-wallets/node_modules/aes-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
+ "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==",
+ "dev": true
+ },
+ "node_modules/@ethersproject/keccak256": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz",
+ "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "js-sha3": "0.8.0"
+ }
+ },
+ "node_modules/@ethersproject/logger": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz",
+ "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ]
+ },
+ "node_modules/@ethersproject/networks": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz",
+ "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/pbkdf2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz",
+ "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/properties": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz",
+ "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/providers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz",
+ "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/basex": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/networks": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/web": "^5.7.0",
+ "bech32": "1.1.4",
+ "ws": "7.4.6"
+ }
+ },
+ "node_modules/@ethersproject/providers/node_modules/ws": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
+ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@ethersproject/random": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz",
+ "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/rlp": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz",
+ "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/sha2": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz",
+ "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/signing-key": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz",
+ "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "bn.js": "^5.2.1",
+ "elliptic": "6.5.4",
+ "hash.js": "1.1.7"
+ }
+ },
+ "node_modules/@ethersproject/solidity": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz",
+ "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/sha2": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/strings": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz",
+ "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/transactions": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz",
+ "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/rlp": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/units": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz",
+ "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/constants": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/wallet": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz",
+ "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.7.0",
+ "@ethersproject/abstract-signer": "^5.7.0",
+ "@ethersproject/address": "^5.7.0",
+ "@ethersproject/bignumber": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/hdnode": "^5.7.0",
+ "@ethersproject/json-wallets": "^5.7.0",
+ "@ethersproject/keccak256": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/random": "^5.7.0",
+ "@ethersproject/signing-key": "^5.7.0",
+ "@ethersproject/transactions": "^5.7.0",
+ "@ethersproject/wordlists": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/web": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz",
+ "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/base64": "^5.7.0",
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@ethersproject/wordlists": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz",
+ "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/bytes": "^5.7.0",
+ "@ethersproject/hash": "^5.7.0",
+ "@ethersproject/logger": "^5.7.0",
+ "@ethersproject/properties": "^5.7.0",
+ "@ethersproject/strings": "^5.7.0"
+ }
+ },
+ "node_modules/@fastify/busboy": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
+ "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz",
+ "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==",
+ "dev": true,
+ "dependencies": {
+ "ethereumjs-abi": "^0.6.8",
+ "ethereumjs-util": "^6.2.1",
+ "ethjs-util": "^0.1.6",
+ "tweetnacl": "^1.0.3",
+ "tweetnacl-util": "^0.15.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@metamask/eth-sig-util/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/@noble/curves": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz",
+ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "1.3.2"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz",
+ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/secp256k1": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz",
+ "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nomicfoundation/edr": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.4.tgz",
+ "integrity": "sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/edr-darwin-arm64": "0.6.4",
+ "@nomicfoundation/edr-darwin-x64": "0.6.4",
+ "@nomicfoundation/edr-linux-arm64-gnu": "0.6.4",
+ "@nomicfoundation/edr-linux-arm64-musl": "0.6.4",
+ "@nomicfoundation/edr-linux-x64-gnu": "0.6.4",
+ "@nomicfoundation/edr-linux-x64-musl": "0.6.4",
+ "@nomicfoundation/edr-win32-x64-msvc": "0.6.4"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-darwin-arm64": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.4.tgz",
+ "integrity": "sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-darwin-x64": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.4.tgz",
+ "integrity": "sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-arm64-gnu": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.4.tgz",
+ "integrity": "sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-arm64-musl": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.4.tgz",
+ "integrity": "sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-x64-gnu": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.4.tgz",
+ "integrity": "sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-linux-x64-musl": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.4.tgz",
+ "integrity": "sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/edr-win32-x64-msvc": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.4.tgz",
+ "integrity": "sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-common": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz",
+ "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-util": "9.0.4"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-rlp": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz",
+ "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==",
+ "dev": true,
+ "bin": {
+ "rlp": "bin/rlp.cjs"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-tx": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz",
+ "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-common": "4.0.4",
+ "@nomicfoundation/ethereumjs-rlp": "5.0.4",
+ "@nomicfoundation/ethereumjs-util": "9.0.4",
+ "ethereum-cryptography": "0.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "c-kzg": "^2.1.2"
+ },
+ "peerDependenciesMeta": {
+ "c-kzg": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nomicfoundation/ethereumjs-util": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz",
+ "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/ethereumjs-rlp": "5.0.4",
+ "ethereum-cryptography": "0.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "c-kzg": "^2.1.2"
+ },
+ "peerDependenciesMeta": {
+ "c-kzg": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-chai-matchers": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz",
+ "integrity": "sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/chai-as-promised": "^7.1.3",
+ "chai-as-promised": "^7.1.1",
+ "deep-eql": "^4.0.1",
+ "ordinal": "^1.0.3"
+ },
+ "peerDependencies": {
+ "@nomicfoundation/hardhat-ethers": "^3.0.0",
+ "chai": "^4.2.0",
+ "ethers": "^6.1.0",
+ "hardhat": "^2.9.4"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-ethers": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz",
+ "integrity": "sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "lodash.isequal": "^4.5.0"
+ },
+ "peerDependencies": {
+ "ethers": "^6.1.0",
+ "hardhat": "^2.0.0"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-network-helpers": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz",
+ "integrity": "sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ethereumjs-util": "^7.1.4"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.9.5"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-toolbox": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz",
+ "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==",
+ "dev": true,
+ "peerDependencies": {
+ "@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
+ "@nomicfoundation/hardhat-ethers": "^3.0.0",
+ "@nomicfoundation/hardhat-network-helpers": "^1.0.0",
+ "@nomicfoundation/hardhat-verify": "^1.0.0",
+ "@typechain/ethers-v6": "^0.4.0",
+ "@typechain/hardhat": "^8.0.0",
+ "@types/chai": "^4.2.0",
+ "@types/mocha": ">=9.1.0",
+ "@types/node": ">=12.0.0",
+ "chai": "^4.2.0",
+ "ethers": "^6.4.0",
+ "hardhat": "^2.11.0",
+ "hardhat-gas-reporter": "^1.0.8",
+ "solidity-coverage": "^0.8.1",
+ "ts-node": ">=8.0.0",
+ "typechain": "^8.2.0",
+ "typescript": ">=4.5.0"
+ }
+ },
+ "node_modules/@nomicfoundation/hardhat-verify": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz",
+ "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.1.2",
+ "@ethersproject/address": "^5.0.2",
+ "cbor": "^8.1.0",
+ "chalk": "^2.4.2",
+ "debug": "^4.1.1",
+ "lodash.clonedeep": "^4.5.0",
+ "semver": "^6.3.0",
+ "table": "^6.8.0",
+ "undici": "^5.14.0"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.0.4"
+ }
+ },
+ "node_modules/@nomicfoundation/slang": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang/-/slang-0.17.0.tgz",
+ "integrity": "sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/slang-darwin-arm64": "0.17.0",
+ "@nomicfoundation/slang-darwin-x64": "0.17.0",
+ "@nomicfoundation/slang-linux-arm64-gnu": "0.17.0",
+ "@nomicfoundation/slang-linux-arm64-musl": "0.17.0",
+ "@nomicfoundation/slang-linux-x64-gnu": "0.17.0",
+ "@nomicfoundation/slang-linux-x64-musl": "0.17.0",
+ "@nomicfoundation/slang-win32-arm64-msvc": "0.17.0",
+ "@nomicfoundation/slang-win32-ia32-msvc": "0.17.0",
+ "@nomicfoundation/slang-win32-x64-msvc": "0.17.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-darwin-arm64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-darwin-arm64/-/slang-darwin-arm64-0.17.0.tgz",
+ "integrity": "sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-darwin-x64": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-darwin-x64/-/slang-darwin-x64-0.17.0.tgz",
+ "integrity": "sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-linux-arm64-gnu": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-linux-arm64-gnu/-/slang-linux-arm64-gnu-0.17.0.tgz",
+ "integrity": "sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-linux-arm64-musl": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-linux-arm64-musl/-/slang-linux-arm64-musl-0.17.0.tgz",
+ "integrity": "sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-linux-x64-gnu": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-linux-x64-gnu/-/slang-linux-x64-gnu-0.17.0.tgz",
+ "integrity": "sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-linux-x64-musl": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-linux-x64-musl/-/slang-linux-x64-musl-0.17.0.tgz",
+ "integrity": "sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-win32-arm64-msvc": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-win32-arm64-msvc/-/slang-win32-arm64-msvc-0.17.0.tgz",
+ "integrity": "sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-win32-ia32-msvc": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-win32-ia32-msvc/-/slang-win32-ia32-msvc-0.17.0.tgz",
+ "integrity": "sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/slang-win32-x64-msvc": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/slang-win32-x64-msvc/-/slang-win32-x64-msvc-0.17.0.tgz",
+ "integrity": "sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz",
+ "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ },
+ "optionalDependencies": {
+ "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2",
+ "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz",
+ "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz",
+ "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz",
+ "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz",
+ "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz",
+ "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz",
+ "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz",
+ "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@oclif/command": {
+ "version": "1.8.36",
+ "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.8.36.tgz",
+ "integrity": "sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@oclif/config": "^1.18.2",
+ "@oclif/errors": "^1.3.6",
+ "@oclif/help": "^1.0.1",
+ "@oclif/parser": "^3.8.17",
+ "debug": "^4.1.1",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@oclif/config": "^1"
+ }
+ },
+ "node_modules/@oclif/command/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@oclif/config": {
+ "version": "1.18.17",
+ "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.17.tgz",
+ "integrity": "sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@oclif/errors": "^1.3.6",
+ "@oclif/parser": "^3.8.17",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-wsl": "^2.1.1",
+ "tslib": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/config/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/config/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/config/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@oclif/core": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.16.0.tgz",
+ "integrity": "sha512-dL6atBH0zCZl1A1IXCKJgLPrM/wR7K+Wi401E/IvqsK8m2iCHW+0TEOGrans/cuN3oTW+uxIyJFHJ8Im0k4qBw==",
+ "dev": true,
+ "dependencies": {
+ "@types/cli-progress": "^3.11.0",
+ "ansi-escapes": "^4.3.2",
+ "ansi-styles": "^4.3.0",
+ "cardinal": "^2.1.1",
+ "chalk": "^4.1.2",
+ "clean-stack": "^3.0.1",
+ "cli-progress": "^3.12.0",
+ "debug": "^4.3.4",
+ "ejs": "^3.1.8",
+ "get-package-type": "^0.1.0",
+ "globby": "^11.1.0",
+ "hyperlinker": "^1.0.0",
+ "indent-string": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "js-yaml": "^3.14.1",
+ "natural-orderby": "^2.0.3",
+ "object-treeify": "^1.1.33",
+ "password-prompt": "^1.1.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "supports-color": "^8.1.1",
+ "supports-hyperlinks": "^2.2.0",
+ "ts-node": "^10.9.1",
+ "tslib": "^2.5.0",
+ "widest-line": "^3.1.0",
+ "wordwrap": "^1.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/clean-stack": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz",
+ "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@oclif/core/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/core/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@oclif/errors": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.6.tgz",
+ "integrity": "sha512-fYaU4aDceETd89KXP+3cLyg9EHZsLD3RxF2IU9yxahhBpspWjkWi3Dy3bTgcwZ3V47BgxQaGapzJWDM33XIVDQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^3.0.0",
+ "fs-extra": "^8.1",
+ "indent-string": "^4.0.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/errors/node_modules/clean-stack": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz",
+ "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/errors/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/errors/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@oclif/errors/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@oclif/errors/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@oclif/help": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/@oclif/help/-/help-1.0.15.tgz",
+ "integrity": "sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@oclif/config": "1.18.16",
+ "@oclif/errors": "1.3.6",
+ "chalk": "^4.1.2",
+ "indent-string": "^4.0.0",
+ "lodash": "^4.17.21",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "widest-line": "^3.1.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/@oclif/config": {
+ "version": "1.18.16",
+ "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.18.16.tgz",
+ "integrity": "sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@oclif/errors": "^1.3.6",
+ "@oclif/parser": "^3.8.16",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-wsl": "^2.1.1",
+ "tslib": "^2.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@oclif/help/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/help/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@oclif/help/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/linewrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz",
+ "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==",
+ "dev": true
+ },
+ "node_modules/@oclif/parser": {
+ "version": "3.8.17",
+ "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.17.tgz",
+ "integrity": "sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "dependencies": {
+ "@oclif/errors": "^1.3.6",
+ "@oclif/linewrap": "^1.0.0",
+ "chalk": "^4.1.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@oclif/parser/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@oclif/parser/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@oclif/plugin-help": {
+ "version": "5.2.20",
+ "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-5.2.20.tgz",
+ "integrity": "sha512-u+GXX/KAGL9S10LxAwNUaWdzbEBARJ92ogmM7g3gDVud2HioCmvWQCDohNRVZ9GYV9oKwZ/M8xwd6a1d95rEKQ==",
+ "dev": true,
+ "dependencies": {
+ "@oclif/core": "^2.15.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/contracts": {
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz",
+ "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/contracts-upgradeable": {
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz",
+ "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/contracts5": {
+ "name": "@openzeppelin/contracts",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.0.tgz",
+ "integrity": "sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/defender-admin-client": {
+ "version": "1.54.6",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.54.6.tgz",
+ "integrity": "sha512-P4lxJDySrekWNuPa7FeyW/UmuxnuIXIAGYr5gZnmnMHRsYNaw+XfgkiCDfoGtjEyJbXYxXttYF6iAZhWQPdf1g==",
+ "deprecated": "This package has been deprecated and will no longer be maintained, please use @openzeppelin/defender-sdk package instead.",
+ "dev": true,
+ "dependencies": {
+ "@openzeppelin/defender-base-client": "1.54.6",
+ "axios": "^1.4.0",
+ "ethers": "^5.7.2",
+ "lodash": "^4.17.19",
+ "node-fetch": "^2.6.0"
+ }
+ },
+ "node_modules/@openzeppelin/defender-admin-client/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@openzeppelin/defender-base-client": {
+ "version": "1.54.6",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.54.6.tgz",
+ "integrity": "sha512-PTef+rMxkM5VQ7sLwLKSjp2DBakYQd661ZJiSRywx+q/nIpm3B/HYGcz5wPZCA5O/QcEP6TatXXDoeMwimbcnw==",
+ "deprecated": "This package has been deprecated and will no longer be maintained, please use @openzeppelin/defender-sdk package instead.",
+ "dev": true,
+ "dependencies": {
+ "amazon-cognito-identity-js": "^6.0.1",
+ "async-retry": "^1.3.3",
+ "axios": "^1.4.0",
+ "lodash": "^4.17.19",
+ "node-fetch": "^2.6.0"
+ }
+ },
+ "node_modules/@openzeppelin/defender-sdk-base-client": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-1.15.0.tgz",
+ "integrity": "sha512-nuf/xegMIuKCO0hMrxI1KQKTzQw1iCl/9kew2nJM9MrFIohhfEXItc5rbJRoV/jehmK/Jhi9ATF9OHH09StEsQ==",
+ "dev": true,
+ "dependencies": {
+ "amazon-cognito-identity-js": "^6.3.6",
+ "async-retry": "^1.3.3"
+ }
+ },
+ "node_modules/@openzeppelin/defender-sdk-deploy-client": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-1.15.0.tgz",
+ "integrity": "sha512-2ODMN4j5pPYWyIOvA/zRQmJ0tJyqi6NV3S/PyvufBXa3oj/MDnVO5bMGSQFH0M2VE3bg+i/rcUb0hdbX9Rtm5Q==",
+ "dev": true,
+ "dependencies": {
+ "@openzeppelin/defender-sdk-base-client": "^1.15.0",
+ "axios": "^1.7.2",
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.5.1.tgz",
+ "integrity": "sha512-wRwq9f2PqlfIdNGFApsqRpqptqy98exSFp8SESb6Brgw4L07sExySInNJhscM/tWVSnR1Qnuws9Ck6Fs5zIxvg==",
+ "dev": true,
+ "dependencies": {
+ "@openzeppelin/defender-admin-client": "^1.52.0",
+ "@openzeppelin/defender-base-client": "^1.52.0",
+ "@openzeppelin/defender-sdk-base-client": "^1.8.0",
+ "@openzeppelin/defender-sdk-deploy-client": "^1.8.0",
+ "@openzeppelin/upgrades-core": "^1.31.2",
+ "chalk": "^4.1.0",
+ "debug": "^4.1.1",
+ "ethereumjs-util": "^7.1.5",
+ "proper-lockfile": "^4.1.1",
+ "undici": "^5.14.0"
+ },
+ "bin": {
+ "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js"
+ },
+ "peerDependencies": {
+ "@nomicfoundation/hardhat-ethers": "^3.0.0",
+ "@nomicfoundation/hardhat-verify": "^1.1.0",
+ "ethers": "^6.6.0",
+ "hardhat": "^2.0.2"
+ },
+ "peerDependenciesMeta": {
+ "@nomicfoundation/hardhat-verify": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/hardhat-upgrades/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.40.0.tgz",
+ "integrity": "sha512-4bPSXdEqHsNRL5T1ybPLneWGYjzGl6XWGWkv7aUoFFgz8mOdarstRBX1Wi4XJFw6IeHPUI7mMSQr2jdz8Y2ypQ==",
+ "dev": true,
+ "dependencies": {
+ "@nomicfoundation/slang": "^0.17.0",
+ "cbor": "^9.0.0",
+ "chalk": "^4.1.0",
+ "compare-versions": "^6.0.0",
+ "debug": "^4.1.1",
+ "ethereumjs-util": "^7.0.3",
+ "minimatch": "^9.0.5",
+ "minimist": "^1.2.7",
+ "proper-lockfile": "^4.1.1",
+ "solidity-ast": "^0.4.51"
+ },
+ "bin": {
+ "openzeppelin-upgrades-core": "dist/cli/cli.js"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz",
+ "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==",
+ "dev": true,
+ "dependencies": {
+ "nofilter": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@polygon-hermez/common": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/@polygon-hermez/common/-/common-2.6.4.tgz",
+ "integrity": "sha512-ZGl/K1MaXHaDagqKCqkQgCRu9EfJ+mbK+t4GeVnDywMYGCyi7jF1u71Pyh4Rch3XFd/8rW/eVL4x4jkGwN16JQ==",
+ "dev": true,
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "ethereumjs-util": "^7.1.4"
+ }
+ },
+ "node_modules/@polygon-hermez/vm": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-6.0.13.tgz",
+ "integrity": "sha512-PjwXd1Tz18ABf2JefQy20J/M5B5IOGqU3yoHl0TcOGqxxbJ+Z/DRZePkVYgpS2wDh9tudX/o75Dlm3ajG+hClg==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/block": "^3.6.1",
+ "@ethereumjs/blockchain": "^5.5.1",
+ "@ethereumjs/common": "^2.6.2",
+ "@ethereumjs/tx": "^3.5.0",
+ "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v6.0.0-fork.9",
+ "async-eventemitter": "^0.2.4",
+ "core-js-pure": "^3.0.1",
+ "debug": "^4.3.3",
+ "ethereumjs-util": "^7.1.4",
+ "ethers": "^5.6.2",
+ "functional-red-black-tree": "^1.0.1",
+ "lodash": "^4.17.21",
+ "mcl-wasm": "^0.7.1",
+ "merkle-patricia-tree": "^4.2.3",
+ "rustbn.js": "~0.2.0"
+ }
+ },
+ "node_modules/@polygon-hermez/vm/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@polygon-hermez/zkevm-commonjs": {
+ "name": "@0xpolygonhermez/zkevm-commonjs",
+ "version": "5.0.0",
+ "resolved": "git+ssh://git@github.com/hermeznetwork/zkevm-commonjs.git#1bc8b6729bd8873eba433376cb6f2565b8c9ad41",
+ "dev": true,
+ "license": "pending",
+ "dependencies": {
+ "@ethereumjs/block": "^3.6.2",
+ "@ethereumjs/tx": "^3.4.0",
+ "@polygon-hermez/common": "2.6.4",
+ "@polygon-hermez/vm": "6.0.12",
+ "ethereumjs-util": "^7.1.4",
+ "ethers": "^5.5.4",
+ "ffjavascript": "^0.2.55",
+ "lodash": "^4.17.21",
+ "pg": "^8.7.1"
+ }
+ },
+ "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/@polygon-hermez/vm": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@polygon-hermez/vm/-/vm-6.0.12.tgz",
+ "integrity": "sha512-X882QZUmbLFRBgD+uA5I4bP+i62bmixRgXsDu9vEhy7fVOfZvH4AbzgZ9lOivylkdj7oNfJO1WC5fvugiAa6pw==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/block": "^3.6.1",
+ "@ethereumjs/blockchain": "^5.5.1",
+ "@ethereumjs/common": "^2.6.2",
+ "@ethereumjs/tx": "^3.5.0",
+ "@polygon-hermez/zkevm-commonjs": "github:hermeznetwork/zkevm-commonjs#v1.0.0",
+ "async-eventemitter": "^0.2.4",
+ "core-js-pure": "^3.0.1",
+ "debug": "^4.3.3",
+ "ethereumjs-util": "^7.1.4",
+ "ethers": "^5.6.2",
+ "functional-red-black-tree": "^1.0.1",
+ "lodash": "^4.17.21",
+ "mcl-wasm": "^0.7.1",
+ "merkle-patricia-tree": "^4.2.3",
+ "rustbn.js": "~0.2.0"
+ }
+ },
+ "node_modules/@polygon-hermez/zkevm-commonjs/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/@resolver-engine/core": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz",
+ "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.1.0",
+ "is-url": "^1.2.4",
+ "request": "^2.85.0"
+ }
+ },
+ "node_modules/@resolver-engine/core/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@resolver-engine/fs": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz",
+ "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==",
+ "dev": true,
+ "dependencies": {
+ "@resolver-engine/core": "^0.3.3",
+ "debug": "^3.1.0"
+ }
+ },
+ "node_modules/@resolver-engine/fs/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@resolver-engine/imports": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz",
+ "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==",
+ "dev": true,
+ "dependencies": {
+ "@resolver-engine/core": "^0.3.3",
+ "debug": "^3.1.0",
+ "hosted-git-info": "^2.6.0",
+ "path-browserify": "^1.0.0",
+ "url": "^0.11.0"
+ }
+ },
+ "node_modules/@resolver-engine/imports-fs": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz",
+ "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==",
+ "dev": true,
+ "dependencies": {
+ "@resolver-engine/fs": "^0.3.3",
+ "@resolver-engine/imports": "^0.3.3",
+ "debug": "^3.1.0"
+ }
+ },
+ "node_modules/@resolver-engine/imports-fs/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@resolver-engine/imports/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@scure/base": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz",
+ "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==",
+ "dev": true,
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz",
+ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "~1.4.0",
+ "@noble/hashes": "~1.4.0",
+ "@scure/base": "~1.1.6"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32/node_modules/@noble/curves": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
+ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.4.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz",
+ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "~1.4.0",
+ "@scure/base": "~1.1.6"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@sentry/core": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz",
+ "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/minimal": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/hub": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz",
+ "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/minimal": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz",
+ "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/node": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz",
+ "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/core": "5.30.0",
+ "@sentry/hub": "5.30.0",
+ "@sentry/tracing": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "cookie": "^0.4.1",
+ "https-proxy-agent": "^5.0.0",
+ "lru_map": "^0.3.3",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/tracing": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz",
+ "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "5.30.0",
+ "@sentry/minimal": "5.30.0",
+ "@sentry/types": "5.30.0",
+ "@sentry/utils": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/types": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz",
+ "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/utils": {
+ "version": "5.30.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz",
+ "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "5.30.0",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz",
+ "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@smithy/types/node_modules/tslib": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz",
+ "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==",
+ "dev": true
+ },
+ "node_modules/@solidity-parser/parser": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz",
+ "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "antlr4ts": "^0.5.0-alpha.4"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+ "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "node_modules/@typechain/ethers-v6": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz",
+ "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lodash": "^4.17.15",
+ "ts-essentials": "^7.0.1"
+ },
+ "peerDependencies": {
+ "ethers": "6.x",
+ "typechain": "^8.3.1",
+ "typescript": ">=4.7.0"
+ }
+ },
+ "node_modules/@typechain/hardhat": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz",
+ "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fs-extra": "^9.1.0"
+ },
+ "peerDependencies": {
+ "@typechain/ethers-v6": "^0.4.3",
+ "ethers": "^6.1.0",
+ "hardhat": "^2.9.9",
+ "typechain": "^8.3.1"
+ }
+ },
+ "node_modules/@types/abstract-leveldown": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz",
+ "integrity": "sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==",
+ "dev": true
+ },
+ "node_modules/@types/bn.js": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz",
+ "integrity": "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.20",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz",
+ "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/chai-as-promised": {
+ "version": "7.1.8",
+ "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz",
+ "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/cli-progress": {
+ "version": "3.11.6",
+ "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.6.tgz",
+ "integrity": "sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/level-errors": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz",
+ "integrity": "sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==",
+ "dev": true
+ },
+ "node_modules/@types/levelup": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz",
+ "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==",
+ "dev": true,
+ "dependencies": {
+ "@types/abstract-leveldown": "*",
+ "@types/level-errors": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/mkdirp": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz",
+ "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.9",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz",
+ "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/node": {
+ "version": "22.8.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.2.tgz",
+ "integrity": "sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
+ "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/@types/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.16",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz",
+ "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/resolve": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
+ "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/secp256k1": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz",
+ "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
+ "dev": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/abstract-leveldown": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz",
+ "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "immediate": "^3.2.3",
+ "level-concat-iterator": "~2.0.0",
+ "level-supports": "~1.0.0",
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/abstract-leveldown/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
+ "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.0"
+ }
+ },
+ "node_modules/aes-js": {
+ "version": "4.0.0-beta.5",
+ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz",
+ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/amazon-cognito-identity-js": {
+ "version": "6.3.12",
+ "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.12.tgz",
+ "integrity": "sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==",
+ "dev": true,
+ "dependencies": {
+ "@aws-crypto/sha256-js": "1.2.2",
+ "buffer": "4.9.2",
+ "fast-base64-decode": "^1.0.0",
+ "isomorphic-unfetch": "^3.0.0",
+ "js-cookie": "^2.2.1"
+ }
+ },
+ "node_modules/amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.2"
+ }
+ },
+ "node_modules/ansi-align": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.1.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansicolors": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+ "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==",
+ "dev": true
+ },
+ "node_modules/antlr4ts": {
+ "version": "0.5.0-alpha.4",
+ "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz",
+ "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
+ "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/async-eventemitter": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz",
+ "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==",
+ "dev": true,
+ "dependencies": {
+ "async": "^2.4.0"
+ }
+ },
+ "node_modules/async-retry": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
+ "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
+ "dev": true,
+ "dependencies": {
+ "retry": "0.13.1"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true
+ },
+ "node_modules/axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base-x": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz",
+ "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dev": true,
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
+ "node_modules/bech32": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
+ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/blake-hash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz",
+ "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^3.0.0",
+ "node-gyp-build": "^4.2.2",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/blake2b": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz",
+ "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==",
+ "dev": true,
+ "dependencies": {
+ "blake2b-wasm": "^2.4.0",
+ "nanoassert": "^2.0.0"
+ }
+ },
+ "node_modules/blake2b-wasm": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz",
+ "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==",
+ "dev": true,
+ "dependencies": {
+ "b4a": "^1.0.1",
+ "nanoassert": "^2.0.0"
+ }
+ },
+ "node_modules/blakejs": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
+ "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==",
+ "dev": true
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
+ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
+ "dev": true
+ },
+ "node_modules/boxen": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
+ "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-align": "^3.0.0",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.0",
+ "cli-boxes": "^2.2.1",
+ "string-width": "^4.2.2",
+ "type-fest": "^0.20.2",
+ "widest-line": "^3.1.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/boxen/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/boxen/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/boxen/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/boxen/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/boxen/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-aes/node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true
+ },
+ "node_modules/bs58": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
+ "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==",
+ "dev": true,
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/bs58check": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
+ "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==",
+ "dev": true,
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "dev": true,
+ "dependencies": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz",
+ "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cardinal": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+ "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
+ "dev": true,
+ "dependencies": {
+ "ansicolors": "~0.3.2",
+ "redeyed": "~2.1.0"
+ },
+ "bin": {
+ "cdl": "bin/cdl.js"
+ }
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "dev": true
+ },
+ "node_modules/cbor": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz",
+ "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "nofilter": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12.19"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chai-as-promised": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz",
+ "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "check-error": "^1.0.2"
+ },
+ "peerDependencies": {
+ "chai": ">= 2.1.2 < 6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/circomlibjs": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.1.tgz",
+ "integrity": "sha512-Bl7Mylf/VERdI5bRTIQ4hpi2EgbfIvEyJrn/MPh2pEqScbCkatX44RF8fuNGigoiQGdhItaIikgHKLTdlPPLPQ==",
+ "dev": true,
+ "dependencies": {
+ "blake-hash": "^2.0.0",
+ "blake2b": "^2.1.3",
+ "ethers": "^5.5.1",
+ "ffjavascript": "^0.2.45"
+ }
+ },
+ "node_modules/circomlibjs/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cli-boxes": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-progress": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+ "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-table3": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
+ "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "object-assign": "^4.1.0",
+ "string-width": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "colors": "^1.1.2"
+ }
+ },
+ "node_modules/cli-table3/node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-table3/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cli-table3/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "dev": true,
+ "dependencies": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/command-exists": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
+ "dev": true
+ },
+ "node_modules/command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
+ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==",
+ "dev": true
+ },
+ "node_modules/compare-versions": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz",
+ "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/concat-stream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/concat-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/concat-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.38.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz",
+ "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "dev": true,
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/death": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz",
+ "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deferred-leveldown": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz",
+ "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==",
+ "dev": true,
+ "dependencies": {
+ "abstract-leveldown": "~6.2.1",
+ "inherits": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deferred-leveldown/node_modules/abstract-leveldown": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
+ "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "immediate": "^3.2.3",
+ "level-concat-iterator": "~2.0.0",
+ "level-supports": "~1.0.0",
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deferred-leveldown/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/difflib": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz",
+ "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "heap": ">= 0.2.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
+ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dev": true,
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "dev": true,
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "dev": true
+ },
+ "node_modules/encoding-down": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz",
+ "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==",
+ "dev": true,
+ "dependencies": {
+ "abstract-leveldown": "^6.2.1",
+ "inherits": "^2.0.3",
+ "level-codec": "^9.0.0",
+ "level-errors": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
+ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "esprima": "^2.7.1",
+ "estraverse": "^1.9.1",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.2.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-mocha": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz",
+ "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "ramda": "^0.27.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eth-ens-namehash": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
+ "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==",
+ "dev": true,
+ "dependencies": {
+ "idna-uts46-hx": "^2.3.1",
+ "js-sha3": "^0.5.7"
+ }
+ },
+ "node_modules/eth-ens-namehash/node_modules/js-sha3": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
+ "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==",
+ "dev": true
+ },
+ "node_modules/eth-gas-reporter": {
+ "version": "0.2.27",
+ "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz",
+ "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@solidity-parser/parser": "^0.14.0",
+ "axios": "^1.5.1",
+ "cli-table3": "^0.5.0",
+ "colors": "1.4.0",
+ "ethereum-cryptography": "^1.0.3",
+ "ethers": "^5.7.2",
+ "fs-readdir-recursive": "^1.1.0",
+ "lodash": "^4.17.14",
+ "markdown-table": "^1.1.3",
+ "mocha": "^10.2.0",
+ "req-cwd": "^2.0.0",
+ "sha1": "^1.1.1",
+ "sync-request": "^6.0.0"
+ },
+ "peerDependencies": {
+ "@codechecks/client": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@codechecks/client": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eth-gas-reporter/node_modules/@noble/hashes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz",
+ "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/eth-gas-reporter/node_modules/@scure/bip32": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz",
+ "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@noble/secp256k1": "~1.7.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/eth-gas-reporter/node_modules/@scure/bip39": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz",
+ "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
+ "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@noble/hashes": "1.2.0",
+ "@noble/secp256k1": "1.7.1",
+ "@scure/bip32": "1.1.5",
+ "@scure/bip39": "1.1.1"
+ }
+ },
+ "node_modules/eth-gas-reporter/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/ethereum-bloom-filters": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz",
+ "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "^1.4.0"
+ }
+ },
+ "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz",
+ "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==",
+ "dev": true,
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/ethereum-cryptography": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
+ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/ethereum-waffle": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz",
+ "integrity": "sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==",
+ "dev": true,
+ "dependencies": {
+ "@ethereum-waffle/chai": "^3.4.4",
+ "@ethereum-waffle/compiler": "^3.4.4",
+ "@ethereum-waffle/mock-contract": "^3.4.4",
+ "@ethereum-waffle/provider": "^3.4.4",
+ "ethers": "^5.0.1"
+ },
+ "bin": {
+ "waffle": "bin/waffle"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/ethereum-waffle/node_modules/ethers": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz",
+ "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "dependencies": {
+ "@ethersproject/abi": "5.7.0",
+ "@ethersproject/abstract-provider": "5.7.0",
+ "@ethersproject/abstract-signer": "5.7.0",
+ "@ethersproject/address": "5.7.0",
+ "@ethersproject/base64": "5.7.0",
+ "@ethersproject/basex": "5.7.0",
+ "@ethersproject/bignumber": "5.7.0",
+ "@ethersproject/bytes": "5.7.0",
+ "@ethersproject/constants": "5.7.0",
+ "@ethersproject/contracts": "5.7.0",
+ "@ethersproject/hash": "5.7.0",
+ "@ethersproject/hdnode": "5.7.0",
+ "@ethersproject/json-wallets": "5.7.0",
+ "@ethersproject/keccak256": "5.7.0",
+ "@ethersproject/logger": "5.7.0",
+ "@ethersproject/networks": "5.7.1",
+ "@ethersproject/pbkdf2": "5.7.0",
+ "@ethersproject/properties": "5.7.0",
+ "@ethersproject/providers": "5.7.2",
+ "@ethersproject/random": "5.7.0",
+ "@ethersproject/rlp": "5.7.0",
+ "@ethersproject/sha2": "5.7.0",
+ "@ethersproject/signing-key": "5.7.0",
+ "@ethersproject/solidity": "5.7.0",
+ "@ethersproject/strings": "5.7.0",
+ "@ethersproject/transactions": "5.7.0",
+ "@ethersproject/units": "5.7.0",
+ "@ethersproject/wallet": "5.7.0",
+ "@ethersproject/web": "5.7.1",
+ "@ethersproject/wordlists": "5.7.0"
+ }
+ },
+ "node_modules/ethereumjs-abi": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz",
+ "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.8",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ethereumjs-abi/node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/ethereumjs-abi/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz",
+ "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ethereumjs-util": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
+ "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==",
+ "dev": true,
+ "dependencies": {
+ "@types/bn.js": "^5.1.0",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ethers": {
+ "version": "6.13.4",
+ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz",
+ "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/ethers-io/"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "@adraffy/ens-normalize": "1.10.1",
+ "@noble/curves": "1.2.0",
+ "@noble/hashes": "1.3.2",
+ "@types/node": "22.7.5",
+ "aes-js": "4.0.0-beta.5",
+ "tslib": "2.7.0",
+ "ws": "8.17.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/ethers/node_modules/@types/node": {
+ "version": "22.7.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
+ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "node_modules/ethers/node_modules/tslib": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/ethjs-unit": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
+ "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "number-to-bn": "1.7.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ethjs-unit/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
+ "dev": true
+ },
+ "node_modules/ethjs-util": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
+ "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
+ "dev": true,
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
+ "node_modules/fast-base64-decode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz",
+ "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "dev": true
+ },
+ "node_modules/ffjavascript": {
+ "version": "0.2.63",
+ "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz",
+ "integrity": "sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==",
+ "dev": true,
+ "dependencies": {
+ "wasmbuilder": "0.0.16",
+ "wasmcurves": "0.2.2",
+ "web-worker": "1.2.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-back": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-yarn-workspace-root": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz",
+ "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==",
+ "dev": true,
+ "dependencies": {
+ "micromatch": "^4.0.2"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true
+ },
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fp-ts": {
+ "version": "1.19.3",
+ "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz",
+ "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==",
+ "dev": true
+ },
+ "node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
+ "dev": true
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core": {
+ "version": "2.13.2",
+ "resolved": "https://registry.npmjs.org/ganache-core/-/ganache-core-2.13.2.tgz",
+ "integrity": "sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==",
+ "bundleDependencies": [
+ "keccak"
+ ],
+ "deprecated": "ganache-core is now ganache; visit https://trfl.io/g7 for details",
+ "dev": true,
+ "hasShrinkwrap": true,
+ "dependencies": {
+ "abstract-leveldown": "3.0.0",
+ "async": "2.6.2",
+ "bip39": "2.5.0",
+ "cachedown": "1.0.0",
+ "clone": "2.1.2",
+ "debug": "3.2.6",
+ "encoding-down": "5.0.4",
+ "eth-sig-util": "3.0.0",
+ "ethereumjs-abi": "0.6.8",
+ "ethereumjs-account": "3.0.0",
+ "ethereumjs-block": "2.2.2",
+ "ethereumjs-common": "1.5.0",
+ "ethereumjs-tx": "2.1.2",
+ "ethereumjs-util": "6.2.1",
+ "ethereumjs-vm": "4.2.0",
+ "heap": "0.2.6",
+ "keccak": "3.0.1",
+ "level-sublevel": "6.6.4",
+ "levelup": "3.1.1",
+ "lodash": "4.17.20",
+ "lru-cache": "5.1.1",
+ "merkle-patricia-tree": "3.0.0",
+ "patch-package": "6.2.2",
+ "seedrandom": "3.0.1",
+ "source-map-support": "0.5.12",
+ "tmp": "0.1.0",
+ "web3-provider-engine": "14.2.1",
+ "websocket": "1.0.32"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ },
+ "optionalDependencies": {
+ "ethereumjs-wallet": "0.6.5",
+ "web3": "1.2.11"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/abi": {
+ "version": "5.0.0-beta.153",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/address": ">=5.0.0-beta.128",
+ "@ethersproject/bignumber": ">=5.0.0-beta.130",
+ "@ethersproject/bytes": ">=5.0.0-beta.129",
+ "@ethersproject/constants": ">=5.0.0-beta.128",
+ "@ethersproject/hash": ">=5.0.0-beta.128",
+ "@ethersproject/keccak256": ">=5.0.0-beta.127",
+ "@ethersproject/logger": ">=5.0.0-beta.129",
+ "@ethersproject/properties": ">=5.0.0-beta.131",
+ "@ethersproject/strings": ">=5.0.0-beta.130"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/abstract-provider": {
+ "version": "5.0.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/networks": "^5.0.7",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/transactions": "^5.0.9",
+ "@ethersproject/web": "^5.0.12"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/abstract-signer": {
+ "version": "5.0.10",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-provider": "^5.0.8",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/address": {
+ "version": "5.0.9",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/rlp": "^5.0.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/base64": {
+ "version": "5.0.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/bignumber": {
+ "version": "5.0.13",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "bn.js": "^4.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/bytes": {
+ "version": "5.0.9",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/constants": {
+ "version": "5.0.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bignumber": "^5.0.13"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/hash": {
+ "version": "5.0.10",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abstract-signer": "^5.0.10",
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/keccak256": {
+ "version": "5.0.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9",
+ "js-sha3": "0.5.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/logger": {
+ "version": "5.0.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/networks": {
+ "version": "5.0.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/properties": {
+ "version": "5.0.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/rlp": {
+ "version": "5.0.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/signing-key": {
+ "version": "5.0.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "elliptic": "6.5.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/strings": {
+ "version": "5.0.8",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/logger": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/transactions": {
+ "version": "5.0.9",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/address": "^5.0.9",
+ "@ethersproject/bignumber": "^5.0.13",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/constants": "^5.0.8",
+ "@ethersproject/keccak256": "^5.0.7",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/rlp": "^5.0.7",
+ "@ethersproject/signing-key": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@ethersproject/web": {
+ "version": "5.0.12",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.buymeacoffee.com/ricmoo"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/base64": "^5.0.7",
+ "@ethersproject/bytes": "^5.0.9",
+ "@ethersproject/logger": "^5.0.8",
+ "@ethersproject/properties": "^5.0.7",
+ "@ethersproject/strings": "^5.0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@sindresorhus/is": {
+ "version": "0.14.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "defer-to-connect": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@types/bn.js": {
+ "version": "4.11.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@types/node": {
+ "version": "14.14.20",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/@types/pbkdf2": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@types/secp256k1": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/ganache-core/node_modules/abstract-leveldown": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/accepts": {
+ "version": "1.3.7",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/aes-js": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ajv": {
+ "version": "6.12.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/arr-diff": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/arr-union": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/array-flatten": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/array-unique": {
+ "version": "0.3.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/asn1": {
+ "version": "0.2.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/asn1.js": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/assert-plus": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/async": {
+ "version": "2.6.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.11"
+ }
+ },
+ "node_modules/ganache-core/node_modules/async-eventemitter": {
+ "version": "0.2.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^2.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/async-limiter": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/asynckit": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/atob": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/aws4": {
+ "version": "1.11.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/js-tokens": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-core": {
+ "version": "6.26.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-core/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-core/node_modules/json5": {
+ "version": "0.5.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-core/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-core/node_modules/slash": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-generator": {
+ "version": "6.26.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.17.4",
+ "source-map": "^0.5.7",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-generator/node_modules/jsesc": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-define-map": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-function-name": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-regex": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-helpers": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-messages": {
+ "version": "6.23.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-preset-env": {
+ "version": "1.7.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-preset-env/node_modules/semver": {
+ "version": "5.7.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-register": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-core": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "home-or-tmp": "^2.0.0",
+ "lodash": "^4.17.4",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.4.15"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-register/node_modules/source-map-support": {
+ "version": "0.4.18",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "^0.5.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-template": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-traverse/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-traverse/node_modules/globals": {
+ "version": "9.18.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-traverse/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/babel-types": {
+ "version": "6.26.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babel-types/node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babelify": {
+ "version": "7.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-core": "^6.0.14",
+ "object-assign": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/babylon": {
+ "version": "6.18.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/backoff": {
+ "version": "2.5.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "precond": "0.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/balanced-match": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/base": {
+ "version": "0.11.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/base-x": {
+ "version": "3.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/base64-js": {
+ "version": "1.5.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bcrypt-pbkdf/node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/ganache-core/node_modules/bignumber.js": {
+ "version": "9.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bip39": {
+ "version": "2.5.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "create-hash": "^1.1.0",
+ "pbkdf2": "^3.0.9",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "unorm": "^1.3.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/blakejs": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/ganache-core/node_modules/bluebird": {
+ "version": "3.7.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/bn.js": {
+ "version": "4.11.9",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/body-parser": {
+ "version": "1.19.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/body-parser/node_modules/qs": {
+ "version": "6.7.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/brorand": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserify-des": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserify-rsa": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^5.0.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserify-rsa/node_modules/bn.js": {
+ "version": "5.1.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/browserify-sign": {
+ "version": "4.2.1",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserify-sign/node_modules/bn.js": {
+ "version": "5.1.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/browserify-sign/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/browserslist": {
+ "version": "3.2.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bs58": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "base-x": "^3.0.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bs58check": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bs58": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/buffer": {
+ "version": "5.7.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/ganache-core/node_modules/buffer-from": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/buffer-to-arraybuffer": {
+ "version": "0.0.5",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/bufferutil": {
+ "version": "4.0.3",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bytes": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bytewise": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytewise-core": "^1.2.2",
+ "typewise": "^1.0.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/bytewise-core": {
+ "version": "1.2.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "typewise-core": "^1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cache-base": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cacheable-request": {
+ "version": "6.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cacheable-request/node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cachedown": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "^2.4.1",
+ "lru-cache": "^3.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cachedown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cachedown/node_modules/lru-cache": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "pseudomap": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/call-bind": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/caniuse-lite": {
+ "version": "1.0.30001174",
+ "dev": true,
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ganache-core/node_modules/caseless": {
+ "version": "0.12.0",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/ganache-core/node_modules/chalk": {
+ "version": "2.4.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/checkpoint-store": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "functional-red-black-tree": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/chownr": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ci-info": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/cids": {
+ "version": "0.7.5",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "class-is": "^1.1.0",
+ "multibase": "~0.6.0",
+ "multicodec": "^1.0.0",
+ "multihashes": "~0.4.15"
+ },
+ "engines": {
+ "node": ">=4.0.0",
+ "npm": ">=3.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cids/node_modules/multicodec": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer": "^5.6.0",
+ "varint": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cipher-base": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-is": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/class-utils": {
+ "version": "0.3.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/define-property": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/class-utils/node_modules/kind-of": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/clone": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/clone-response": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/collection-visit": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/color-convert": {
+ "version": "1.9.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/color-name": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/combined-stream": {
+ "version": "1.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/component-emitter": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/concat-map": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/concat-stream": {
+ "version": "1.6.2",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/content-disposition": {
+ "version": "0.5.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/content-disposition/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/content-hash": {
+ "version": "2.5.2",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "cids": "^0.7.1",
+ "multicodec": "^0.5.5",
+ "multihashes": "^0.4.15"
+ }
+ },
+ "node_modules/ganache-core/node_modules/content-type": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/convert-source-map": {
+ "version": "1.7.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/convert-source-map/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/cookie": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/cookiejar": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/core-js": {
+ "version": "2.6.12",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/core-js-pure": {
+ "version": "3.8.2",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/core-util-is": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/cors": {
+ "version": "2.8.5",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/create-hash": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/create-hmac": {
+ "version": "1.1.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/cross-fetch": {
+ "version": "2.2.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "2.1.2",
+ "whatwg-fetch": "2.0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/d": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/dashdash": {
+ "version": "1.14.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/debug": {
+ "version": "3.2.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/decode-uri-component": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/decompress-response": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/deep-equal": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/defer-to-connect": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/deferred-leveldown": {
+ "version": "4.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~5.0.0",
+ "inherits": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/deferred-leveldown/node_modules/abstract-leveldown": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/define-properties": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/define-property": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/defined": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/depd": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/des.js": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/destroy": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/detect-indent": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "repeating": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/dom-walk": {
+ "version": "0.1.2",
+ "dev": true
+ },
+ "node_modules/ganache-core/node_modules/dotignore": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "ignored": "bin/ignored"
+ }
+ },
+ "node_modules/ganache-core/node_modules/duplexer3": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ee-first": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/electron-to-chromium": {
+ "version": "1.3.636",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/elliptic": {
+ "version": "6.5.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.4.0",
+ "brorand": "^1.0.1",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/encoding": {
+ "version": "0.1.13",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/encoding-down": {
+ "version": "5.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "^5.0.0",
+ "inherits": "^2.0.3",
+ "level-codec": "^9.0.0",
+ "level-errors": "^2.0.0",
+ "xtend": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/encoding-down/node_modules/abstract-leveldown": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/encoding/node_modules/iconv-lite": {
+ "version": "0.6.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/errno": {
+ "version": "0.1.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/es-abstract": {
+ "version": "1.18.0-next.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/es5-ext": {
+ "version": "0.10.53",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "es6-iterator": "~2.0.3",
+ "es6-symbol": "~3.1.3",
+ "next-tick": "~1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/es6-iterator": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "d": "1",
+ "es5-ext": "^0.10.35",
+ "es6-symbol": "^3.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/es6-symbol": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "d": "^1.0.1",
+ "ext": "^1.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/escape-html": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/esutils": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/etag": {
+ "version": "1.8.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-block-tracker": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eth-query": "^2.1.0",
+ "ethereumjs-tx": "^1.3.3",
+ "ethereumjs-util": "^5.1.3",
+ "ethjs-util": "^0.1.3",
+ "json-rpc-engine": "^3.6.0",
+ "pify": "^2.3.0",
+ "tape": "^4.6.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-tx": {
+ "version": "1.3.7",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-block-tracker/node_modules/pify": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-ens-namehash": {
+ "version": "2.0.8",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "idna-uts46-hx": "^2.3.1",
+ "js-sha3": "^0.5.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-infura": {
+ "version": "3.2.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-fetch": "^2.1.1",
+ "eth-json-rpc-middleware": "^1.5.0",
+ "json-rpc-engine": "^3.4.0",
+ "json-rpc-error": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "async": "^2.5.0",
+ "eth-query": "^2.1.2",
+ "eth-tx-summary": "^3.1.2",
+ "ethereumjs-block": "^1.6.0",
+ "ethereumjs-tx": "^1.3.3",
+ "ethereumjs-util": "^5.1.2",
+ "ethereumjs-vm": "^2.1.0",
+ "fetch-ponyfill": "^4.0.0",
+ "json-rpc-engine": "^3.6.0",
+ "json-rpc-error": "^2.0.0",
+ "json-stable-stringify": "^1.0.1",
+ "promise-to-callback": "^1.0.0",
+ "tape": "^4.6.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/abstract-leveldown": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/deferred-leveldown": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-account": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block": {
+ "version": "1.7.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-block/node_modules/ethereum-common": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-tx": {
+ "version": "1.3.7",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
+ "version": "2.2.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/isarray": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-codec": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-errors": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-iterator-stream/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~1.0.15",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/level-ws/node_modules/xtend": {
+ "version": "2.1.2",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/levelup": {
+ "version": "1.3.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~1.2.1",
+ "level-codec": "~7.0.0",
+ "level-errors": "~1.0.3",
+ "level-iterator-stream": "~1.3.0",
+ "prr": "~1.0.1",
+ "semver": "~5.4.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.7.1",
+ "functional-red-black-tree": "^1.0.1",
+ "immediate": "^3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^1.4.2",
+ "ethereumjs-util": "^5.0.0",
+ "level-ws": "0.0.0",
+ "levelup": "^1.2.1",
+ "memdown": "^1.0.0",
+ "readable-stream": "^2.0.0",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/merkle-patricia-tree/node_modules/async": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/object-keys": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/semver": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-json-rpc-middleware/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-lib": {
+ "version": "0.1.29",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "nano-json-stream-parser": "^0.1.2",
+ "servify": "^0.1.12",
+ "ws": "^3.0.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-query": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-rpc-random-id": "^1.0.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-sig-util": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "elliptic": "^6.4.0",
+ "ethereumjs-abi": "0.6.5",
+ "ethereumjs-util": "^5.1.1",
+ "tweetnacl": "^1.0.0",
+ "tweetnacl-util": "^0.15.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi": {
+ "version": "0.6.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.10.0",
+ "ethereumjs-util": "^4.3.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-abi/node_modules/ethereumjs-util": {
+ "version": "4.5.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.8.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "rlp": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-sig-util/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary": {
+ "version": "3.2.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "async": "^2.1.2",
+ "clone": "^2.0.0",
+ "concat-stream": "^1.5.1",
+ "end-of-stream": "^1.1.0",
+ "eth-query": "^2.0.2",
+ "ethereumjs-block": "^1.4.1",
+ "ethereumjs-tx": "^1.1.1",
+ "ethereumjs-util": "^5.0.1",
+ "ethereumjs-vm": "^2.6.0",
+ "through2": "^2.0.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/abstract-leveldown": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/deferred-leveldown": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-account": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block": {
+ "version": "1.7.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-block/node_modules/ethereum-common": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-tx": {
+ "version": "1.3.7",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
+ "version": "2.2.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/isarray": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-codec": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-errors": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-iterator-stream/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~1.0.15",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/level-ws/node_modules/xtend": {
+ "version": "2.1.2",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/levelup": {
+ "version": "1.3.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~1.2.1",
+ "level-codec": "~7.0.0",
+ "level-errors": "~1.0.3",
+ "level-iterator-stream": "~1.3.0",
+ "prr": "~1.0.1",
+ "semver": "~5.4.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.7.1",
+ "functional-red-black-tree": "^1.0.1",
+ "immediate": "^3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^1.4.2",
+ "ethereumjs-util": "^5.0.0",
+ "level-ws": "0.0.0",
+ "levelup": "^1.2.1",
+ "memdown": "^1.0.0",
+ "readable-stream": "^2.0.0",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/merkle-patricia-tree/node_modules/async": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/object-keys": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/semver": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eth-tx-summary/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethashjs": {
+ "version": "0.0.8",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.1.2",
+ "buffer-xor": "^2.0.1",
+ "ethereumjs-util": "^7.0.2",
+ "miller-rabin": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethashjs/node_modules/bn.js": {
+ "version": "5.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethashjs/node_modules/buffer-xor": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethashjs/node_modules/ethereumjs-util": {
+ "version": "7.0.7",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^5.1.2",
+ "create-hash": "^1.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereum-bloom-filters": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "js-sha3": "^0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereum-bloom-filters/node_modules/js-sha3": {
+ "version": "0.8.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ethereum-common": {
+ "version": "0.0.18",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereum-cryptography": {
+ "version": "0.1.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/pbkdf2": "^3.0.0",
+ "@types/secp256k1": "^4.0.1",
+ "blakejs": "^1.1.0",
+ "browserify-aes": "^1.2.0",
+ "bs58check": "^2.1.2",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "hash.js": "^1.1.7",
+ "keccak": "^3.0.0",
+ "pbkdf2": "^3.0.17",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.1.2",
+ "scrypt-js": "^3.0.0",
+ "secp256k1": "^4.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-abi": {
+ "version": "0.6.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.11.8",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-account": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-util": "^6.0.0",
+ "rlp": "^2.2.1",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block": {
+ "version": "2.2.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/abstract-leveldown": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/deferred-leveldown": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/isarray": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-codec": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-errors": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~1.0.15",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": {
+ "version": "2.1.2",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/levelup": {
+ "version": "1.3.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~1.2.1",
+ "level-codec": "~7.0.0",
+ "level-errors": "~1.0.3",
+ "level-iterator-stream": "~1.3.0",
+ "prr": "~1.0.1",
+ "semver": "~5.4.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.7.1",
+ "functional-red-black-tree": "^1.0.1",
+ "immediate": "^3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^1.4.2",
+ "ethereumjs-util": "^5.0.0",
+ "level-ws": "0.0.0",
+ "levelup": "^1.2.1",
+ "memdown": "^1.0.0",
+ "readable-stream": "^2.0.0",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/object-keys": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/semver": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-block/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-blockchain": {
+ "version": "4.0.4",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.6.1",
+ "ethashjs": "~0.0.7",
+ "ethereumjs-block": "~2.2.2",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.1.0",
+ "flow-stoplight": "^1.0.0",
+ "level-mem": "^3.0.1",
+ "lru-cache": "^5.1.1",
+ "rlp": "^2.2.2",
+ "semaphore": "^1.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-common": {
+ "version": "1.5.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-tx": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm": {
+ "version": "4.2.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "core-js-pure": "^3.0.1",
+ "ethereumjs-account": "^3.0.0",
+ "ethereumjs-block": "^2.2.2",
+ "ethereumjs-blockchain": "^4.0.3",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.2",
+ "ethereumjs-util": "^6.2.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1",
+ "util.promisify": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/abstract-leveldown": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/deferred-leveldown": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/isarray": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-codec": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-errors": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~1.0.15",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": {
+ "version": "2.1.2",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/levelup": {
+ "version": "1.3.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~1.2.1",
+ "level-codec": "~7.0.0",
+ "level-errors": "~1.0.3",
+ "level-iterator-stream": "~1.3.0",
+ "prr": "~1.0.1",
+ "semver": "~5.4.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.7.1",
+ "functional-red-black-tree": "^1.0.1",
+ "immediate": "^3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^1.4.2",
+ "ethereumjs-util": "^5.0.0",
+ "level-ws": "0.0.0",
+ "levelup": "^1.2.1",
+ "memdown": "^1.0.0",
+ "readable-stream": "^2.0.0",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/object-keys": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/semver": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-vm/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ethereumjs-wallet": {
+ "version": "0.6.5",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "aes-js": "^3.1.1",
+ "bs58check": "^2.1.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethereumjs-util": "^6.0.0",
+ "randombytes": "^2.0.6",
+ "safe-buffer": "^5.1.2",
+ "scryptsy": "^1.2.1",
+ "utf8": "^3.0.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethjs-unit": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "number-to-bn": "1.7.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ethjs-unit/node_modules/bn.js": {
+ "version": "4.11.6",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ethjs-util": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/eventemitter3": {
+ "version": "4.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/events": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/define-property": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/kind-of": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/expand-brackets/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/express": {
+ "version": "4.17.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/express/node_modules/qs": {
+ "version": "6.7.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/express/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ext": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "type": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ext/node_modules/type": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/extend": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/extglob": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/extglob/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/extglob/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/extsprintf": {
+ "version": "1.3.0",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/fake-merkle-patricia-tree": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "checkpoint-store": "^1.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/fetch-ponyfill": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "~1.7.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/is-stream": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fetch-ponyfill/node_modules/node-fetch": {
+ "version": "1.7.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encoding": "^0.1.11",
+ "is-stream": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/finalhandler": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "fs-extra": "^4.0.3",
+ "micromatch": "^3.1.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/braces/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fill-range/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/fs-extra": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/micromatch": {
+ "version": "3.1.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/find-yarn-workspace-root/node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/flow-stoplight": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/for-each": {
+ "version": "0.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/for-in": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/forever-agent": {
+ "version": "0.6.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/form-data": {
+ "version": "2.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/ganache-core/node_modules/forwarded": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fresh": {
+ "version": "0.5.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/function-bind": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/get-intrinsic": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/get-stream": {
+ "version": "5.2.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ganache-core/node_modules/get-value": {
+ "version": "2.0.6",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/getpass": {
+ "version": "0.1.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/glob": {
+ "version": "7.1.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/global": {
+ "version": "4.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/got": {
+ "version": "9.6.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/got/node_modules/get-stream": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/har-schema": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/har-validator": {
+ "version": "5.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-ansi": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-flag": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-symbol-support-x": {
+ "version": "1.4.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-to-string-tag-x": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "has-symbol-support-x": "^1.4.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-value": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-values": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-values/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/has-values/node_modules/is-number": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/hash-base": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/hash-base/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/hash.js": {
+ "version": "1.1.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/heap": {
+ "version": "0.2.6",
+ "dev": true
+ },
+ "node_modules/ganache-core/node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/home-or-tmp": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/http-cache-semantics": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/http-errors": {
+ "version": "1.7.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/http-errors/node_modules/inherits": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/http-https": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/http-signature": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/ganache-core/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/idna-uts46-hx": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "punycode": "2.1.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/idna-uts46-hx/node_modules/punycode": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ieee754": {
+ "version": "1.2.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ganache-core/node_modules/immediate": {
+ "version": "3.2.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/inflight": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/inherits": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/invariant": {
+ "version": "2.2.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-arguments": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-callable": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-ci": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ci-info": "^2.0.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-date-object": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-finite": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-fn": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-function": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/is-hex-prefixed": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-negative-zero": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-object": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-regex": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-retry-allowed": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-symbol": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/is-windows": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/isarray": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/isexe": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/isobject": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/isstream": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/isurl": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/js-sha3": {
+ "version": "0.5.7",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/js-tokens": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/jsbn": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/json-buffer": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/json-rpc-engine": {
+ "version": "3.8.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "async": "^2.0.1",
+ "babel-preset-env": "^1.7.0",
+ "babelify": "^7.3.0",
+ "json-rpc-error": "^2.0.0",
+ "promise-to-callback": "^1.0.0",
+ "safe-event-emitter": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/json-rpc-error": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/json-rpc-random-id": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/json-schema": {
+ "version": "0.2.3",
+ "dev": true
+ },
+ "node_modules/ganache-core/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/json-stable-stringify": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsonify": "~0.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/jsonify": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "Public Domain"
+ },
+ "node_modules/ganache-core/node_modules/jsprim": {
+ "version": "1.4.1",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/keccak": {
+ "version": "3.0.1",
+ "dev": true,
+ "hasInstallScript": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/keyv": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/kind-of": {
+ "version": "6.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/klaw-sync": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-codec": {
+ "version": "9.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-errors": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-iterator-stream": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.5",
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-mem": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "level-packager": "~4.0.0",
+ "memdown": "~3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-mem/node_modules/abstract-leveldown": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-mem/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/level-mem/node_modules/memdown": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~5.0.0",
+ "functional-red-black-tree": "~1.0.1",
+ "immediate": "~3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-mem/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/level-packager": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encoding-down": "~5.0.0",
+ "levelup": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-post": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ltgt": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-sublevel": {
+ "version": "6.6.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytewise": "~1.1.0",
+ "level-codec": "^9.0.0",
+ "level-errors": "^2.0.0",
+ "level-iterator-stream": "^2.0.3",
+ "ltgt": "~2.1.1",
+ "pull-defer": "^0.2.2",
+ "pull-level": "^2.0.3",
+ "pull-stream": "^3.6.8",
+ "typewiselite": "~1.0.0",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/level-ws": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.8",
+ "xtend": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/levelup": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~4.0.0",
+ "level-errors": "~2.0.0",
+ "level-iterator-stream": "~3.0.0",
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/levelup/node_modules/level-iterator-stream": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/lodash": {
+ "version": "4.17.20",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/looper": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/loose-envify": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/lowercase-keys": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ltgt": {
+ "version": "2.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/map-cache": {
+ "version": "0.2.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/map-visit": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/md5.js": {
+ "version": "1.3.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/media-typer": {
+ "version": "0.3.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/merkle-patricia-tree": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.6.1",
+ "ethereumjs-util": "^5.2.0",
+ "level-mem": "^3.0.1",
+ "level-ws": "^1.0.0",
+ "readable-stream": "^3.0.6",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/merkle-patricia-tree/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/methods": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mime": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mime-db": {
+ "version": "1.45.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mime-types": {
+ "version": "2.1.28",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.45.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mimic-response": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/min-document": {
+ "version": "2.19.0",
+ "dev": true,
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/minimatch": {
+ "version": "3.0.4",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/minimist": {
+ "version": "1.2.5",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/minizlib": {
+ "version": "1.3.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^2.9.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/minizlib/node_modules/minipass": {
+ "version": "2.9.0",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mkdirp": {
+ "version": "0.5.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mkdirp-promise": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "mkdirp": "*"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/mock-fs": {
+ "version": "4.13.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/multibase": {
+ "version": "0.6.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/multicodec": {
+ "version": "0.5.7",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "varint": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/multihashes": {
+ "version": "0.4.21",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "multibase": "^0.7.0",
+ "varint": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/multihashes/node_modules/multibase": {
+ "version": "0.7.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "base-x": "^3.0.8",
+ "buffer": "^5.5.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/nano-json-stream-parser": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/nanomatch": {
+ "version": "1.2.13",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/negotiator": {
+ "version": "0.6.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/next-tick": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/nice-try": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/node-fetch": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/node-gyp-build": {
+ "version": "4.2.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/normalize-url": {
+ "version": "4.5.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/number-to-bn": {
+ "version": "1.7.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/number-to-bn/node_modules/bn.js": {
+ "version": "4.11.6",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-assign": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/define-property": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-copy/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-inspect": {
+ "version": "1.9.0",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-is": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-keys": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object-visit": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object.assign": {
+ "version": "4.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/object.pick": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/oboe": {
+ "version": "2.1.4",
+ "dev": true,
+ "license": "BSD",
+ "optional": true,
+ "dependencies": {
+ "http-https": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/on-finished": {
+ "version": "2.3.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/once": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/os-homedir": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/p-cancelable": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/p-timeout": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/p-timeout/node_modules/p-finally": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/parse-asn1": {
+ "version": "5.1.6",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/parse-headers": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/parseurl": {
+ "version": "1.3.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/pascalcase": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package": {
+ "version": "6.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^1.2.1",
+ "fs-extra": "^7.0.1",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.0",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33"
+ },
+ "bin": {
+ "patch-package": "index.js"
+ },
+ "engines": {
+ "npm": ">5"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/path-key": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/semver": {
+ "version": "5.7.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/slash": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/tmp": {
+ "version": "0.0.33",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/patch-package/node_modules/which": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/ganache-core/node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/path-parse": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/pbkdf2": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/ganache-core/node_modules/performance-now": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/precond": {
+ "version": "0.2.3",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/prepend-http": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/private": {
+ "version": "0.1.8",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/process": {
+ "version": "0.11.10",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/promise-to-callback": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-fn": "^1.0.0",
+ "set-immediate-shim": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/proxy-addr": {
+ "version": "2.0.6",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/prr": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/pseudomap": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/psl": {
+ "version": "1.8.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/pull-cat": {
+ "version": "1.1.11",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/pull-defer": {
+ "version": "0.2.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/pull-level": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "level-post": "^1.0.7",
+ "pull-cat": "^1.1.9",
+ "pull-live": "^1.0.1",
+ "pull-pushable": "^2.0.0",
+ "pull-stream": "^3.4.0",
+ "pull-window": "^2.1.4",
+ "stream-to-pull-stream": "^1.7.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/pull-live": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pull-cat": "^1.1.9",
+ "pull-stream": "^3.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/pull-pushable": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/pull-stream": {
+ "version": "3.6.14",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/pull-window": {
+ "version": "2.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "looper": "^2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/pump": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/punycode": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/qs": {
+ "version": "6.5.2",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/query-string": {
+ "version": "5.1.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/randombytes": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/randomfill": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/range-parser": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/raw-body": {
+ "version": "2.4.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/regenerate": {
+ "version": "1.4.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/regenerator-transform": {
+ "version": "0.10.1",
+ "dev": true,
+ "license": "BSD",
+ "dependencies": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regex-not": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regexp.prototype.flags": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regexp.prototype.flags/node_modules/es-abstract": {
+ "version": "1.17.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regexpu-core": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regjsgen": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/regjsparser": {
+ "version": "0.1.5",
+ "dev": true,
+ "license": "BSD",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/ganache-core/node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/ganache-core/node_modules/repeat-element": {
+ "version": "1.1.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/repeat-string": {
+ "version": "1.6.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/repeating": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-finite": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/request": {
+ "version": "2.88.2",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/resolve-url": {
+ "version": "0.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/responselike": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/resumer": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "through": "~2.3.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ret": {
+ "version": "0.1.15",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/ganache-core/node_modules/rimraf": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ripemd160": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/rlp": {
+ "version": "2.2.6",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.1"
+ },
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/ganache-core/node_modules/rustbn.js": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "(MIT OR Apache-2.0)"
+ },
+ "node_modules/ganache-core/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/safe-event-emitter": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "events": "^3.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/safe-regex": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/ganache-core/node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/scryptsy": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "pbkdf2": "^3.0.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/secp256k1": {
+ "version": "4.0.2",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "elliptic": "^6.5.2",
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/seedrandom": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/semaphore": {
+ "version": "1.1.0",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/send": {
+ "version": "0.17.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/send/node_modules/ms": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/serve-static": {
+ "version": "1.14.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/servify": {
+ "version": "0.1.12",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "body-parser": "^1.16.0",
+ "cors": "^2.8.1",
+ "express": "^4.14.0",
+ "request": "^2.79.0",
+ "xhr": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/set-immediate-shim": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/set-value": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/set-value/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/set-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/setimmediate": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/setprototypeof": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/sha.js": {
+ "version": "2.4.11",
+ "dev": true,
+ "license": "(MIT AND BSD-3-Clause)",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/ganache-core/node_modules/simple-concat": {
+ "version": "1.0.1",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/simple-get": {
+ "version": "2.8.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "decompress-response": "^3.3.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon": {
+ "version": "0.8.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/snapdragon-util/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/define-property": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/kind-of": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/snapdragon/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/source-map": {
+ "version": "0.5.7",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/source-map-resolve": {
+ "version": "0.5.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/source-map-support": {
+ "version": "0.5.12",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/source-map-url": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/split-string": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/sshpk": {
+ "version": "1.16.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/sshpk/node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/ganache-core/node_modules/static-extend": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/define-property": {
+ "version": "0.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/static-extend/node_modules/kind-of": {
+ "version": "5.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/statuses": {
+ "version": "1.5.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/stream-to-pull-stream": {
+ "version": "1.7.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "looper": "^3.0.0",
+ "pull-stream": "^3.2.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/stream-to-pull-stream/node_modules/looper": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/strict-uri-encode": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/string.prototype.trim": {
+ "version": "1.2.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/string.prototype.trimend": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/string.prototype.trimstart": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/strip-hex-prefix": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/supports-color": {
+ "version": "5.5.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js": {
+ "version": "0.1.40",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bluebird": "^3.5.0",
+ "buffer": "^5.0.5",
+ "eth-lib": "^0.1.26",
+ "fs-extra": "^4.0.2",
+ "got": "^7.1.0",
+ "mime-types": "^2.1.16",
+ "mkdirp-promise": "^5.0.1",
+ "mock-fs": "^4.1.0",
+ "setimmediate": "^1.0.5",
+ "tar": "^4.0.2",
+ "xhr-request": "^1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/fs-extra": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/get-stream": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/got": {
+ "version": "7.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "decompress-response": "^3.2.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "is-plain-obj": "^1.1.0",
+ "is-retry-allowed": "^1.0.0",
+ "is-stream": "^1.0.0",
+ "isurl": "^1.0.0-alpha5",
+ "lowercase-keys": "^1.0.0",
+ "p-cancelable": "^0.3.0",
+ "p-timeout": "^1.1.1",
+ "safe-buffer": "^5.0.1",
+ "timed-out": "^4.0.0",
+ "url-parse-lax": "^1.0.0",
+ "url-to-options": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/is-stream": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/p-cancelable": {
+ "version": "0.3.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/prepend-http": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/swarm-js/node_modules/url-parse-lax": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "prepend-http": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tape": {
+ "version": "4.13.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-equal": "~1.1.1",
+ "defined": "~1.0.0",
+ "dotignore": "~0.1.2",
+ "for-each": "~0.3.3",
+ "function-bind": "~1.1.1",
+ "glob": "~7.1.6",
+ "has": "~1.0.3",
+ "inherits": "~2.0.4",
+ "is-regex": "~1.0.5",
+ "minimist": "~1.2.5",
+ "object-inspect": "~1.7.0",
+ "resolve": "~1.17.0",
+ "resumer": "~0.0.0",
+ "string.prototype.trim": "~1.2.1",
+ "through": "~2.3.8"
+ },
+ "bin": {
+ "tape": "bin/tape"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tape/node_modules/glob": {
+ "version": "7.1.6",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tape/node_modules/is-regex": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tape/node_modules/object-inspect": {
+ "version": "1.7.0",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tape/node_modules/resolve": {
+ "version": "1.17.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tar": {
+ "version": "4.4.13",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "fs-minipass": "^1.2.5",
+ "minipass": "^2.8.6",
+ "minizlib": "^1.2.1",
+ "mkdirp": "^0.5.0",
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=4.5"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tar/node_modules/fs-minipass": {
+ "version": "1.2.7",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tar/node_modules/minipass": {
+ "version": "2.9.0",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.2",
+ "yallist": "^3.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/through": {
+ "version": "2.3.8",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/through2": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/timed-out": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tmp": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "rimraf": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/to-object-path": {
+ "version": "0.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/to-object-path/node_modules/is-buffer": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/to-readable-stream": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/to-regex": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/toidentifier": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/trim-right": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ganache-core/node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/ganache-core/node_modules/tweetnacl-util": {
+ "version": "0.15.1",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/ganache-core/node_modules/type": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/type-is": {
+ "version": "1.6.18",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ganache-core/node_modules/typedarray": {
+ "version": "0.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/typewise": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "typewise-core": "^1.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/typewise-core": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/typewiselite": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/ultron": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/underscore": {
+ "version": "1.9.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/union-value": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/union-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/universalify": {
+ "version": "0.1.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unorm": {
+ "version": "1.6.0",
+ "dev": true,
+ "license": "MIT or GPL-2.0",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unpipe": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unset-value": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/uri-js": {
+ "version": "4.4.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/urix": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/url-parse-lax": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "prepend-http": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/url-set-query": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/url-to-options": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/use": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/utf-8-validate": {
+ "version": "5.0.4",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-gyp-build": "^4.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/utf8": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/util.promisify": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "for-each": "^0.3.3",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ganache-core/node_modules/utils-merge": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/uuid": {
+ "version": "3.4.0",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/ganache-core/node_modules/varint": {
+ "version": "5.0.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/vary": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ganache-core/node_modules/verror": {
+ "version": "1.10.0",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3": {
+ "version": "1.2.11",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "web3-bzz": "1.2.11",
+ "web3-core": "1.2.11",
+ "web3-eth": "1.2.11",
+ "web3-eth-personal": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-shh": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-bzz": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "^12.12.6",
+ "got": "9.6.0",
+ "swarm-js": "^0.1.40",
+ "underscore": "1.9.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-bzz/node_modules/@types/node": {
+ "version": "12.19.12",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/web3-core": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.5",
+ "@types/node": "^12.12.6",
+ "bignumber.js": "^9.0.0",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-requestmanager": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core-helpers": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "underscore": "1.9.1",
+ "web3-eth-iban": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core-method": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/transactions": "^5.0.0-beta.135",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core-promievent": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "eventemitter3": "4.0.4"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core-requestmanager": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "web3-providers-http": "1.2.11",
+ "web3-providers-ipc": "1.2.11",
+ "web3-providers-ws": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core-subscriptions": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-core/node_modules/@types/node": {
+ "version": "12.19.12",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/web3-eth": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-eth-accounts": "1.2.11",
+ "web3-eth-contract": "1.2.11",
+ "web3-eth-ens": "1.2.11",
+ "web3-eth-iban": "1.2.11",
+ "web3-eth-personal": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-abi": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@ethersproject/abi": "5.0.0-beta.153",
+ "underscore": "1.9.1",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-accounts": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "crypto-browserify": "3.12.0",
+ "eth-lib": "0.2.8",
+ "ethereumjs-common": "^1.3.2",
+ "ethereumjs-tx": "^2.1.1",
+ "scrypt-js": "^3.0.1",
+ "underscore": "1.9.1",
+ "uuid": "3.3.2",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/eth-lib": {
+ "version": "0.2.8",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-accounts/node_modules/uuid": {
+ "version": "3.3.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-contract": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@types/bn.js": "^4.11.5",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-ens": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "content-hash": "^2.5.2",
+ "eth-ens-namehash": "2.0.8",
+ "underscore": "1.9.1",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-promievent": "1.2.11",
+ "web3-eth-abi": "1.2.11",
+ "web3-eth-contract": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-iban": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-personal": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "^12.12.6",
+ "web3-core": "1.2.11",
+ "web3-core-helpers": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-net": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-eth-personal/node_modules/@types/node": {
+ "version": "12.19.12",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/web3-net": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "web3-core": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-utils": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine": {
+ "version": "14.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^2.5.0",
+ "backoff": "^2.5.0",
+ "clone": "^2.0.0",
+ "cross-fetch": "^2.1.0",
+ "eth-block-tracker": "^3.0.0",
+ "eth-json-rpc-infura": "^3.1.0",
+ "eth-sig-util": "3.0.0",
+ "ethereumjs-block": "^1.2.2",
+ "ethereumjs-tx": "^1.2.0",
+ "ethereumjs-util": "^5.1.5",
+ "ethereumjs-vm": "^2.3.4",
+ "json-rpc-error": "^2.0.0",
+ "json-stable-stringify": "^1.0.1",
+ "promise-to-callback": "^1.0.0",
+ "readable-stream": "^2.2.9",
+ "request": "^2.85.0",
+ "semaphore": "^1.0.3",
+ "ws": "^5.1.1",
+ "xhr": "^2.2.0",
+ "xtend": "^4.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/abstract-leveldown": {
+ "version": "2.6.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/deferred-leveldown": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.6.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/eth-sig-util": {
+ "version": "1.4.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
+ "ethereumjs-util": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-account": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-util": "^5.0.0",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block": {
+ "version": "1.7.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereum-common": "0.2.0",
+ "ethereumjs-tx": "^1.2.2",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-block/node_modules/ethereum-common": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-tx": {
+ "version": "1.3.7",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereum-common": "^0.0.18",
+ "ethereumjs-util": "^5.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.1.2",
+ "async-eventemitter": "^0.2.2",
+ "ethereumjs-account": "^2.0.3",
+ "ethereumjs-block": "~2.2.0",
+ "ethereumjs-common": "^1.1.0",
+ "ethereumjs-util": "^6.0.0",
+ "fake-merkle-patricia-tree": "^1.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "merkle-patricia-tree": "^2.3.2",
+ "rustbn.js": "~0.2.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block": {
+ "version": "2.2.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^2.0.1",
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-tx": "^2.1.1",
+ "ethereumjs-util": "^5.0.0",
+ "merkle-patricia-tree": "^2.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": {
+ "version": "5.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "^0.1.3",
+ "rlp": "^2.0.0",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": {
+ "version": "2.1.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "ethereumjs-common": "^1.5.0",
+ "ethereumjs-util": "^6.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ethereumjs-vm/node_modules/ethereumjs-util": {
+ "version": "6.2.1",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@types/bn.js": "^4.11.3",
+ "bn.js": "^4.11.0",
+ "create-hash": "^1.1.2",
+ "elliptic": "^6.5.2",
+ "ethereum-cryptography": "^0.1.3",
+ "ethjs-util": "0.1.6",
+ "rlp": "^2.2.3"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/isarray": {
+ "version": "0.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-codec": {
+ "version": "7.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-errors": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "errno": "~0.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "level-errors": "^1.0.3",
+ "readable-stream": "^1.0.33",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-iterator-stream/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws": {
+ "version": "0.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~1.0.15",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/level-ws/node_modules/xtend": {
+ "version": "2.1.2",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/levelup": {
+ "version": "1.3.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deferred-leveldown": "~1.2.1",
+ "level-codec": "~7.0.0",
+ "level-errors": "~1.0.3",
+ "level-iterator-stream": "~1.3.0",
+ "prr": "~1.0.1",
+ "semver": "~5.4.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ltgt": {
+ "version": "2.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown": {
+ "version": "1.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abstract-leveldown": "~2.7.1",
+ "functional-red-black-tree": "^1.0.1",
+ "immediate": "^3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "2.7.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "~4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "async": "^1.4.2",
+ "ethereumjs-util": "^5.0.0",
+ "level-ws": "0.0.0",
+ "levelup": "^1.2.1",
+ "memdown": "^1.0.0",
+ "readable-stream": "^2.0.0",
+ "rlp": "^2.0.0",
+ "semaphore": ">=1.0.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/merkle-patricia-tree/node_modules/async": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/object-keys": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/semver": {
+ "version": "5.4.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/web3-provider-engine/node_modules/ws": {
+ "version": "5.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-providers-http": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "web3-core-helpers": "1.2.11",
+ "xhr2-cookies": "1.1.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-providers-ipc": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "oboe": "2.1.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-providers-ws": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "eventemitter3": "4.0.4",
+ "underscore": "1.9.1",
+ "web3-core-helpers": "1.2.11",
+ "websocket": "^1.0.31"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-shh": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "web3-core": "1.2.11",
+ "web3-core-method": "1.2.11",
+ "web3-core-subscriptions": "1.2.11",
+ "web3-net": "1.2.11"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-utils": {
+ "version": "1.2.11",
+ "dev": true,
+ "license": "LGPL-3.0",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "eth-lib": "0.2.8",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "underscore": "1.9.1",
+ "utf8": "3.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/web3-utils/node_modules/eth-lib": {
+ "version": "0.2.8",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "bn.js": "^4.11.6",
+ "elliptic": "^6.4.0",
+ "xhr-request-promise": "^0.1.2"
+ }
+ },
+ "node_modules/ganache-core/node_modules/websocket": {
+ "version": "1.0.32",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bufferutil": "^4.0.1",
+ "debug": "^2.2.0",
+ "es5-ext": "^0.10.50",
+ "typedarray-to-buffer": "^3.1.5",
+ "utf-8-validate": "^5.0.2",
+ "yaeti": "^0.0.6"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/websocket/node_modules/debug": {
+ "version": "2.6.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/websocket/node_modules/ms": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/whatwg-fetch": {
+ "version": "2.0.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ganache-core/node_modules/wrappy": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ganache-core/node_modules/ws": {
+ "version": "3.3.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/ws/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/ganache-core/node_modules/xhr": {
+ "version": "2.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/xhr-request": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "buffer-to-arraybuffer": "^0.0.5",
+ "object-assign": "^4.1.1",
+ "query-string": "^5.0.1",
+ "simple-get": "^2.7.0",
+ "timed-out": "^4.0.1",
+ "url-set-query": "^1.0.0",
+ "xhr": "^2.0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/xhr-request-promise": {
+ "version": "0.1.3",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "xhr-request": "^1.1.0"
+ }
+ },
+ "node_modules/ganache-core/node_modules/xhr2-cookies": {
+ "version": "1.1.0",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "cookiejar": "^2.1.1"
+ }
+ },
+ "node_modules/ganache-core/node_modules/xtend": {
+ "version": "4.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/ganache-core/node_modules/yaeti": {
+ "version": "0.0.6",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.32"
+ }
+ },
+ "node_modules/ganache-core/node_modules/yallist": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/ghost-testrpc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz",
+ "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "node-emoji": "^1.10.0"
+ },
+ "bin": {
+ "testrpc-sc": "index.js"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/globby/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/handlebars/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/hardhat": {
+ "version": "2.22.15",
+ "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.15.tgz",
+ "integrity": "sha512-BpTGa9PE/sKAaHi4s/S1e9WGv63DR1m7Lzfd60C8gSEchDPfAJssVRSq0MZ2v2k76ig9m0kHAwVLf5teYwu/Mw==",
+ "dev": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.1.2",
+ "@metamask/eth-sig-util": "^4.0.0",
+ "@nomicfoundation/edr": "^0.6.4",
+ "@nomicfoundation/ethereumjs-common": "4.0.4",
+ "@nomicfoundation/ethereumjs-tx": "5.0.4",
+ "@nomicfoundation/ethereumjs-util": "9.0.4",
+ "@nomicfoundation/solidity-analyzer": "^0.1.0",
+ "@sentry/node": "^5.18.1",
+ "@types/bn.js": "^5.1.0",
+ "@types/lru-cache": "^5.1.0",
+ "adm-zip": "^0.4.16",
+ "aggregate-error": "^3.0.0",
+ "ansi-escapes": "^4.3.0",
+ "boxen": "^5.1.2",
+ "chalk": "^2.4.2",
+ "chokidar": "^4.0.0",
+ "ci-info": "^2.0.0",
+ "debug": "^4.1.1",
+ "enquirer": "^2.3.0",
+ "env-paths": "^2.2.0",
+ "ethereum-cryptography": "^1.0.3",
+ "ethereumjs-abi": "^0.6.8",
+ "find-up": "^2.1.0",
+ "fp-ts": "1.19.3",
+ "fs-extra": "^7.0.1",
+ "glob": "7.2.0",
+ "immutable": "^4.0.0-rc.12",
+ "io-ts": "1.10.4",
+ "json-stream-stringify": "^3.1.4",
+ "keccak": "^3.0.2",
+ "lodash": "^4.17.11",
+ "mnemonist": "^0.38.0",
+ "mocha": "^10.0.0",
+ "p-map": "^4.0.0",
+ "raw-body": "^2.4.1",
+ "resolve": "1.17.0",
+ "semver": "^6.3.0",
+ "solc": "0.8.26",
+ "source-map-support": "^0.5.13",
+ "stacktrace-parser": "^0.1.10",
+ "tsort": "0.0.1",
+ "undici": "^5.14.0",
+ "uuid": "^8.3.2",
+ "ws": "^7.4.6"
+ },
+ "bin": {
+ "hardhat": "internal/cli/bootstrap.js"
+ },
+ "peerDependencies": {
+ "ts-node": "*",
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/hardhat-dependency-compiler": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/hardhat-dependency-compiler/-/hardhat-dependency-compiler-1.2.1.tgz",
+ "integrity": "sha512-xG5iwbspTtxOEiP5UsPngEYQ1Hg+fjTjliapIjdTQmwGkCPofrsDhQDV2O/dopcYzcR68nTx2X8xTewYHgA2rQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.14.0"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.0.0"
+ }
+ },
+ "node_modules/hardhat-gas-reporter": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz",
+ "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-uniq": "1.0.3",
+ "eth-gas-reporter": "^0.2.25",
+ "sha1": "^1.1.1"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.0.2"
+ }
+ },
+ "node_modules/hardhat-switch-network": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/hardhat-switch-network/-/hardhat-switch-network-1.2.0.tgz",
+ "integrity": "sha512-z7YubwwQCBiZ+zwx6cnSQ+KryFxzOjOhRhBVFP8KEfEcJh8dhCcM8zuUb05j4m3GGSCSIpQSH98gAqoFlts+og==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.0.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/@noble/hashes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz",
+ "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ]
+ },
+ "node_modules/hardhat/node_modules/@scure/bip32": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz",
+ "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@noble/secp256k1": "~1.7.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/@scure/bip39": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz",
+ "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "@noble/hashes": "~1.2.0",
+ "@scure/base": "~1.1.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/hardhat/node_modules/ethereum-cryptography": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz",
+ "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.2.0",
+ "@noble/secp256k1": "1.7.1",
+ "@scure/bip32": "1.1.5",
+ "@scure/bip39": "1.1.1"
+ }
+ },
+ "node_modules/hardhat/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/hardhat/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/hardhat/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hardhat/node_modules/resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hardhat/node_modules/solc": {
+ "version": "0.8.26",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz",
+ "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==",
+ "dev": true,
+ "dependencies": {
+ "command-exists": "^1.2.8",
+ "commander": "^8.1.0",
+ "follow-redirects": "^1.12.1",
+ "js-sha3": "0.8.0",
+ "memorystream": "^0.3.1",
+ "semver": "^5.5.0",
+ "tmp": "0.0.33"
+ },
+ "bin": {
+ "solcjs": "solc.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/solc/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/hardhat/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/hardhat/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/heap": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
+ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "^10.0.3"
+ }
+ },
+ "node_modules/http-response-object/node_modules/@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hyperlinker": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz",
+ "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/idna-uts46-hx": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
+ "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "2.1.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immediate": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+ "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==",
+ "dev": true
+ },
+ "node_modules/immutable": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz",
+ "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/io-ts": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz",
+ "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==",
+ "dev": true,
+ "dependencies": {
+ "fp-ts": "^1.0.0"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^2.0.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hex-prefixed": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
+ "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
+ "dev": true
+ },
+ "node_modules/is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
+ "dev": true
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isomorphic-unfetch": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz",
+ "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==",
+ "dev": true,
+ "dependencies": {
+ "node-fetch": "^2.6.1",
+ "unfetch": "^4.2.0"
+ }
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "dev": true
+ },
+ "node_modules/jake": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "dev": true,
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jake/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jake/node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true
+ },
+ "node_modules/jake/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/jake/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/jake/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jake/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/jake/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jake/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jake/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==",
+ "dev": true
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "dev": true
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json-stream-stringify": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz",
+ "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==",
+ "dev": true,
+ "engines": {
+ "node": ">=7.10.1"
+ }
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonschema": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz",
+ "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/keccak": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
+ "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^2.0.0",
+ "node-gyp-build": "^4.2.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/keccak/node_modules/node-addon-api": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
+ "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.9"
+ }
+ },
+ "node_modules/klaw-sync": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz",
+ "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.11"
+ }
+ },
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "dev": true
+ },
+ "node_modules/lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
+ "dev": true,
+ "dependencies": {
+ "invert-kv": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/level-codec": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz",
+ "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-codec/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/level-concat-iterator": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz",
+ "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz",
+ "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==",
+ "dev": true,
+ "dependencies": {
+ "errno": "~0.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-iterator-stream": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz",
+ "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0",
+ "xtend": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-mem": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz",
+ "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==",
+ "dev": true,
+ "dependencies": {
+ "level-packager": "^5.0.3",
+ "memdown": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-packager": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz",
+ "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==",
+ "dev": true,
+ "dependencies": {
+ "encoding-down": "^6.3.0",
+ "levelup": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-supports": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz",
+ "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==",
+ "dev": true,
+ "dependencies": {
+ "xtend": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/level-ws": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz",
+ "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.0",
+ "xtend": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levelup": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz",
+ "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==",
+ "dev": true,
+ "dependencies": {
+ "deferred-leveldown": "~5.3.0",
+ "level-errors": "~2.0.0",
+ "level-iterator-stream": "~4.0.0",
+ "level-supports": "~1.0.0",
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/load-json-file/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/load-json-file/node_modules/strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
+ "dev": true,
+ "dependencies": {
+ "is-utf8": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.assign": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+ "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==",
+ "dev": true
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
+ "dev": true,
+ "dependencies": {
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-func-name": "^2.0.1"
+ }
+ },
+ "node_modules/lru_map": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
+ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/ltgt": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
+ "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==",
+ "dev": true
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/markdown-table": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
+ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/mcl-wasm": {
+ "version": "0.7.9",
+ "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz",
+ "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/memdown": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz",
+ "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==",
+ "dev": true,
+ "dependencies": {
+ "abstract-leveldown": "~6.2.1",
+ "functional-red-black-tree": "~1.0.1",
+ "immediate": "~3.2.3",
+ "inherits": "~2.0.1",
+ "ltgt": "~2.2.0",
+ "safe-buffer": "~5.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/memdown/node_modules/abstract-leveldown": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
+ "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "immediate": "^3.2.3",
+ "level-concat-iterator": "~2.0.0",
+ "level-supports": "~1.0.0",
+ "xtend": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/memdown/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/memdown/node_modules/immediate": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz",
+ "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==",
+ "dev": true
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/merkle-patricia-tree": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz",
+ "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==",
+ "dev": true,
+ "dependencies": {
+ "@types/levelup": "^4.3.0",
+ "ethereumjs-util": "^7.1.4",
+ "level-mem": "^5.0.1",
+ "level-ws": "^2.0.0",
+ "readable-stream": "^3.6.0",
+ "semaphore-async-await": "^1.5.1"
+ }
+ },
+ "node_modules/micro-ftch": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz",
+ "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==",
+ "dev": true
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mnemonist": {
+ "version": "0.38.5",
+ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz",
+ "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==",
+ "dev": true,
+ "dependencies": {
+ "obliterator": "^2.0.0"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz",
+ "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.3",
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.5",
+ "diff": "^5.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^8.1.0",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^5.1.6",
+ "ms": "^2.1.3",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^6.5.1",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/nanoassert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
+ "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
+ "dev": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/natural-orderby": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz",
+ "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
+ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==",
+ "dev": true
+ },
+ "node_modules/node-emoji": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
+ "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-gyp-build": {
+ "version": "4.8.2",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz",
+ "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==",
+ "dev": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
+ "node_modules/nofilter": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
+ "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.19"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/number-to-bn": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
+ "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "4.11.6",
+ "strip-hex-prefix": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/number-to-bn/node_modules/bn.js": {
+ "version": "4.11.6",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
+ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==",
+ "dev": true
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-treeify": {
+ "version": "1.1.33",
+ "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz",
+ "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obliterator": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz",
+ "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==",
+ "dev": true
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "dev": true,
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
+ },
+ "node_modules/open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ordinal": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz",
+ "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
+ "dev": true,
+ "dependencies": {
+ "lcid": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/password-prompt": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz",
+ "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.3.2",
+ "cross-spawn": "^7.0.3"
+ }
+ },
+ "node_modules/patch-package": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz",
+ "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==",
+ "dev": true,
+ "dependencies": {
+ "@yarnpkg/lockfile": "^1.1.0",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^6.0.5",
+ "find-yarn-workspace-root": "^2.0.0",
+ "fs-extra": "^9.0.0",
+ "is-ci": "^2.0.0",
+ "klaw-sync": "^6.0.0",
+ "minimist": "^1.2.6",
+ "open": "^7.4.2",
+ "rimraf": "^2.6.3",
+ "semver": "^5.6.0",
+ "slash": "^2.0.0",
+ "tmp": "^0.0.33",
+ "yaml": "^1.10.2"
+ },
+ "bin": {
+ "patch-package": "index.js"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">5"
+ }
+ },
+ "node_modules/patch-package/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/patch-package/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/patch-package/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/patch-package/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/patch-package/node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/patch-package/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/patch-package/node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/patch-package/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/patch-package/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/patch-package/node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/patch-package/node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/patch-package/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/patch-package/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+ "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+ "dev": true
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "node_modules/pg": {
+ "version": "8.13.1",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
+ "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
+ "dev": true,
+ "dependencies": {
+ "pg-connection-string": "^2.7.0",
+ "pg-pool": "^3.7.0",
+ "pg-protocol": "^1.7.0",
+ "pg-types": "^2.1.0",
+ "pgpass": "1.x"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "optionalDependencies": {
+ "pg-cloudflare": "^1.1.1"
+ },
+ "peerDependencies": {
+ "pg-native": ">=3.0.1"
+ },
+ "peerDependenciesMeta": {
+ "pg-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pg-cloudflare": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
+ "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
+ "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==",
+ "dev": true
+ },
+ "node_modules/pg-int8": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+ "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/pg-pool": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
+ "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
+ "dev": true,
+ "peerDependencies": {
+ "pg": ">=8.0"
+ }
+ },
+ "node_modules/pg-protocol": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
+ "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
+ "dev": true
+ },
+ "node_modules/pg-types": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+ "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+ "dev": true,
+ "dependencies": {
+ "pg-int8": "1.0.1",
+ "postgres-array": "~2.0.0",
+ "postgres-bytea": "~1.0.0",
+ "postgres-date": "~1.0.4",
+ "postgres-interval": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pgpass": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+ "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+ "dev": true,
+ "dependencies": {
+ "split2": "^4.1.0"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dev": true,
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postgres-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+ "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-date": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+ "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postgres-interval": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+ "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+ "dev": true,
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postinstall-postinstall": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz",
+ "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==",
+ "dev": true,
+ "hasInstallScript": true
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-solidity": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz",
+ "integrity": "sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==",
+ "dev": true,
+ "dependencies": {
+ "@solidity-parser/parser": "^0.18.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "prettier": ">=2.3.0"
+ }
+ },
+ "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz",
+ "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==",
+ "dev": true
+ },
+ "node_modules/prettier-plugin-solidity/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/proper-lockfile/node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ramda": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz",
+ "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==",
+ "dev": true
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+ "dev": true,
+ "dependencies": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+ "dev": true,
+ "dependencies": {
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg/node_modules/path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.1.6"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/recursive-readdir/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/recursive-readdir/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/redeyed": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+ "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "~4.0.0"
+ }
+ },
+ "node_modules/redeyed/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/req-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz",
+ "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "req-from": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/req-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz",
+ "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "resolve-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/req-from/node_modules/resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "dev": true,
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request/node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/request/node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "dev": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rlp": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
+ "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^5.2.0"
+ },
+ "bin": {
+ "rlp": "bin/rlp"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rustbn.js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz",
+ "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==",
+ "dev": true
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-array-concat/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sc-istanbul": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz",
+ "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "abbrev": "1.0.x",
+ "async": "1.x",
+ "escodegen": "1.8.x",
+ "esprima": "2.7.x",
+ "glob": "^5.0.15",
+ "handlebars": "^4.0.1",
+ "js-yaml": "3.x",
+ "mkdirp": "0.5.x",
+ "nopt": "3.x",
+ "once": "1.x",
+ "resolve": "1.1.x",
+ "supports-color": "^3.1.0",
+ "which": "^1.1.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "istanbul": "lib/cli.js"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/sc-istanbul/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/sc-istanbul/node_modules/supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/sc-istanbul/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/scrypt-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
+ "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==",
+ "dev": true
+ },
+ "node_modules/secp256k1": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz",
+ "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "elliptic": "^6.5.7",
+ "node-addon-api": "^5.0.0",
+ "node-gyp-build": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/secp256k1/node_modules/bn.js": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
+ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+ "dev": true
+ },
+ "node_modules/secp256k1/node_modules/elliptic": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz",
+ "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/secp256k1/node_modules/node-addon-api": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+ "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
+ "dev": true
+ },
+ "node_modules/semaphore-async-await": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz",
+ "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.1"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "dev": true
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/sha1": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
+ "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "charenc": ">= 0.0.1",
+ "crypt": ">= 0.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shelljs": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
+ "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.0.0",
+ "interpret": "^1.0.0",
+ "rechoir": "^0.6.2"
+ },
+ "bin": {
+ "shjs": "bin/shjs"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/solc": {
+ "version": "0.6.12",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.6.12.tgz",
+ "integrity": "sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==",
+ "dev": true,
+ "dependencies": {
+ "command-exists": "^1.2.8",
+ "commander": "3.0.2",
+ "fs-extra": "^0.30.0",
+ "js-sha3": "0.8.0",
+ "memorystream": "^0.3.1",
+ "require-from-string": "^2.0.0",
+ "semver": "^5.5.0",
+ "tmp": "0.0.33"
+ },
+ "bin": {
+ "solcjs": "solcjs"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/solc-0.8": {
+ "name": "solc",
+ "version": "0.8.20",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.20.tgz",
+ "integrity": "sha512-fPRnGspIEqmhu63RFO3pc79sLA7ZmzO0Uy0L5l6hEt2wAsq0o7UV6pXkAp3Mfv9IBhg7Px/oTu3a+y4gs3BWrQ==",
+ "dev": true,
+ "dependencies": {
+ "command-exists": "^1.2.8",
+ "commander": "^8.1.0",
+ "follow-redirects": "^1.12.1",
+ "js-sha3": "0.8.0",
+ "memorystream": "^0.3.1",
+ "semver": "^5.5.0",
+ "tmp": "0.0.33"
+ },
+ "bin": {
+ "solcjs": "solc.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/solc-0.8.17": {
+ "name": "solc",
+ "version": "0.8.17",
+ "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.17.tgz",
+ "integrity": "sha512-Dtidk2XtTTmkB3IKdyeg6wLYopJnBVxdoykN8oP8VY3PQjN16BScYoUJTXFm2OP7P0hXNAqWiJNmmfuELtLf8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "command-exists": "^1.2.8",
+ "commander": "^8.1.0",
+ "follow-redirects": "^1.12.1",
+ "js-sha3": "0.8.0",
+ "memorystream": "^0.3.1",
+ "semver": "^5.5.0",
+ "tmp": "0.0.33"
+ },
+ "bin": {
+ "solcjs": "solc.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/solc-0.8.17/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/solc-0.8.17/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/solc-0.8/node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/solc-0.8/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/solc/node_modules/fs-extra": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
+ "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^2.1.0",
+ "klaw": "^1.0.0",
+ "path-is-absolute": "^1.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "node_modules/solc/node_modules/jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/solc/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/solc/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/solidity-ast": {
+ "version": "0.4.59",
+ "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.59.tgz",
+ "integrity": "sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==",
+ "dev": true
+ },
+ "node_modules/solidity-coverage": {
+ "version": "0.8.13",
+ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz",
+ "integrity": "sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@ethersproject/abi": "^5.0.9",
+ "@solidity-parser/parser": "^0.18.0",
+ "chalk": "^2.4.2",
+ "death": "^1.1.0",
+ "difflib": "^0.2.4",
+ "fs-extra": "^8.1.0",
+ "ghost-testrpc": "^0.0.2",
+ "global-modules": "^2.0.0",
+ "globby": "^10.0.1",
+ "jsonschema": "^1.2.4",
+ "lodash": "^4.17.21",
+ "mocha": "^10.2.0",
+ "node-emoji": "^1.10.0",
+ "pify": "^4.0.1",
+ "recursive-readdir": "^2.2.2",
+ "sc-istanbul": "^0.4.5",
+ "semver": "^7.3.4",
+ "shelljs": "^0.8.3",
+ "web3-utils": "^1.3.6"
+ },
+ "bin": {
+ "solidity-coverage": "plugins/bin.js"
+ },
+ "peerDependencies": {
+ "hardhat": "^2.11.0"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz",
+ "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/solidity-coverage/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "peer": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/solidity-coverage/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/solidity-docgen": {
+ "version": "0.5.17",
+ "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.5.17.tgz",
+ "integrity": "sha512-RX5SPLFL9z0ZVBcZ/o5l/TKXMgSjNhWdumLuuv+Dy1O/66sThpHYd0HVpzdwAjVff0Ajk76bYM2zZYiMnqBfng==",
+ "dev": true,
+ "dependencies": {
+ "@oclif/command": "^1.8.0",
+ "@oclif/config": "^1.17.0",
+ "@oclif/errors": "^1.3.3",
+ "@oclif/plugin-help": "^5.0.0",
+ "globby": "^11.0.0",
+ "handlebars": "^4.7.6",
+ "json5": "^2.1.3",
+ "lodash": "^4.17.15",
+ "micromatch": "^4.0.2",
+ "minimatch": "^5.0.0",
+ "semver": "^7.3.2",
+ "solc": "^0.6.7"
+ },
+ "bin": {
+ "solidity-docgen": "dist/cli.js"
+ }
+ },
+ "node_modules/solidity-docgen/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/solidity-docgen/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/solidity-docgen/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/solidity-docgen/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "amdefine": ">=0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.20",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "dev": true
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "dev": true,
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sshpk/node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "dev": true
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/stacktrace-parser": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
+ "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.7.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stacktrace-parser/node_modules/type-fest": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
+ "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-format": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz",
+ "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-hex-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
+ "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==",
+ "dev": true,
+ "dependencies": {
+ "is-hex-prefixed": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.5.0",
+ "npm": ">=3"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/table-layout/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table-layout/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/test-value": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+ "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==",
+ "dev": true,
+ "dependencies": {
+ "array-back": "^1.0.3",
+ "typical": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/test-value/node_modules/array-back": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+ "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==",
+ "dev": true,
+ "dependencies": {
+ "typical": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/test-value/node_modules/typical": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+ "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==",
+ "dev": true
+ },
+ "node_modules/testrpc": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz",
+ "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==",
+ "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.",
+ "dev": true
+ },
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/then-request/node_modules/@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/then-request/node_modules/form-data": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz",
+ "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true
+ },
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/ts-command-line-args": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz",
+ "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "command-line-args": "^5.1.1",
+ "command-line-usage": "^6.1.0",
+ "string-format": "^2.0.0"
+ },
+ "bin": {
+ "write-markdown": "dist/write-markdown.js"
+ }
+ },
+ "node_modules/ts-command-line-args/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ts-command-line-args/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ts-command-line-args/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/ts-command-line-args/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/ts-command-line-args/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-command-line-args/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-essentials": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz",
+ "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==",
+ "dev": true,
+ "peer": true,
+ "peerDependencies": {
+ "typescript": ">=3.7.0"
+ }
+ },
+ "node_modules/ts-generator": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ts-generator/-/ts-generator-0.1.1.tgz",
+ "integrity": "sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/mkdirp": "^0.5.2",
+ "@types/prettier": "^2.1.1",
+ "@types/resolve": "^0.0.8",
+ "chalk": "^2.4.1",
+ "glob": "^7.1.2",
+ "mkdirp": "^0.5.1",
+ "prettier": "^2.1.2",
+ "resolve": "^1.8.1",
+ "ts-essentials": "^1.0.0"
+ },
+ "bin": {
+ "ts-generator": "dist/cli/run.js"
+ }
+ },
+ "node_modules/ts-generator/node_modules/ts-essentials": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-1.0.4.tgz",
+ "integrity": "sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==",
+ "dev": true
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tsort": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz",
+ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==",
+ "dev": true
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==",
+ "dev": true
+ },
+ "node_modules/tweetnacl-util": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz",
+ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typechain": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz",
+ "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/prettier": "^2.1.1",
+ "debug": "^4.3.1",
+ "fs-extra": "^7.0.0",
+ "glob": "7.1.7",
+ "js-sha3": "^0.8.0",
+ "lodash": "^4.17.15",
+ "mkdirp": "^1.0.4",
+ "prettier": "^2.3.1",
+ "ts-command-line-args": "^2.2.0",
+ "ts-essentials": "^7.0.1"
+ },
+ "bin": {
+ "typechain": "dist/cli/cli.js"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.3.0"
+ }
+ },
+ "node_modules/typechain/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/typechain/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/typechain/node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/typechain/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "peer": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/typechain/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/typechain/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/typechain/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici": {
+ "version": "5.28.4",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
+ "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
+ "dev": true,
+ "dependencies": {
+ "@fastify/busboy": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
+ "dev": true
+ },
+ "node_modules/unfetch": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz",
+ "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+ "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.12.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true
+ },
+ "node_modules/url/node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/utf8": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+ "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/wasmbuilder": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz",
+ "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==",
+ "dev": true
+ },
+ "node_modules/wasmcurves": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz",
+ "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==",
+ "dev": true,
+ "dependencies": {
+ "wasmbuilder": "0.0.16"
+ }
+ },
+ "node_modules/web-worker": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+ "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==",
+ "dev": true
+ },
+ "node_modules/web3-utils": {
+ "version": "1.10.4",
+ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz",
+ "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==",
+ "dev": true,
+ "dependencies": {
+ "@ethereumjs/util": "^8.1.0",
+ "bn.js": "^5.2.1",
+ "ethereum-bloom-filters": "^1.0.6",
+ "ethereum-cryptography": "^2.1.2",
+ "ethjs-unit": "0.1.6",
+ "number-to-bn": "1.7.0",
+ "randombytes": "^2.1.0",
+ "utf8": "3.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/web3-utils/node_modules/@noble/curves": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz",
+ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==",
+ "dev": true,
+ "dependencies": {
+ "@noble/hashes": "1.4.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/web3-utils/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/web3-utils/node_modules/ethereum-cryptography": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz",
+ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==",
+ "dev": true,
+ "dependencies": {
+ "@noble/curves": "1.4.2",
+ "@noble/hashes": "1.4.0",
+ "@scure/bip32": "1.4.0",
+ "@scure/bip39": "1.3.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==",
+ "dev": true
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/widest-line": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+ "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/window-size": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
+ "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==",
+ "dev": true,
+ "bin": {
+ "window-size": "cli.js"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/winston": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
+ "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
+ "dev": true,
+ "dependencies": {
+ "@colors/colors": "^1.6.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.7.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston-transport": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
+ "dev": true,
+ "dependencies": {
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston/node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true
+ },
+ "node_modules/wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/wordwrapjs/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+ "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
- "dev": true,
- "dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
}
- }
}
diff --git a/package.json b/package.json
index bb019d823..c55ac26b4 100644
--- a/package.json
+++ b/package.json
@@ -1,114 +1,121 @@
{
- "name": "@0xpolygonhermez/zkevm-contracts",
- "description": "Core contracts for the Polygon Hermez zkEVM",
- "version": "3.0.0",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/0xPolygonHermez/contracts-zkEVM.git"
- },
- "main": "index.js",
- "keywords": [
- "zkevm",
- "snark",
- "polygon",
- "hermez",
- "stark",
- "EVM",
- "ethereum",
- "blockchain"
- ],
- "author": "0xPolygonHermez",
- "files": [
- "contracts",
- "index.js",
- "compiled-contracts",
- "src"
- ],
- "bugs": {
- "url": "https://github.com/0xPolygonHermez/contracts-zkEVM/issues"
- },
- "homepage": "https://github.com/0xPolygonHermez/contracts-zkEVM#readme",
- "license": "pending",
- "devDependencies": {
- "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#main",
- "@nomicfoundation/hardhat-toolbox": "^3.0.0",
- "@openzeppelin/contracts": "4.8.2",
- "@openzeppelin/contracts-upgradeable": "4.8.2",
- "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@^5.0.0",
- "@openzeppelin/hardhat-upgrades": "2.5.0",
- "@types/yargs": "^17.0.28",
- "circomlibjs": "0.1.1",
- "dotenv": "^8.6.0",
- "eslint": "^8.51.0",
- "eslint-config-airbnb-base": "^15.0.0",
- "eslint-plugin-mocha": "^9.0.0",
- "ethereum-waffle": "^3.4.4",
- "ffjavascript": "^0.2.60",
- "hardhat": "2.20.0",
- "hardhat-dependency-compiler": "^1.1.3",
- "prettier": "^2.8.8",
- "prettier-plugin-solidity": "^1.1.3",
- "solc-0.8": "npm:solc@0.8.20",
- "solidity-docgen": "^0.5.17"
- },
- "scripts": {
- "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/goerli_$(date +%s)",
- "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/mainnet_$(date +%s)",
- "test": "npx hardhat test test/contractsv2/*ts",
- "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks",
- "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost",
- "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-*.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost",
- "deploy:testnet:ZkEVM:localhost": "npm run prepare:testnet:ZkEVM:localhost && npm run deploy:ZkEVM:localhost",
- "prepare:testnet:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.ts --network goerli",
- "deploy:ZkEVM:goerli": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli",
- "deploy:deployer:ZkEVM:goerli": "npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network goerli",
- "verify:deployer:ZkEVM:goerli": "npx hardhat run deployment/verifyzkEVMDeployer.js --network goerli",
- "deploy:testnet:ZkEVM:goerli": "npm run prepare:testnet:ZkEVM:goerli && npm run deploy:ZkEVM:goerli",
- "upgrade:timelock:goerli": "npx hardhat run upgrade/timeLockUpgrade.js --network goerli",
- "verify:ZkEVM:goerli": "npx hardhat run deployment/verifyContracts.js --network goerli",
- "deploy:deployer:ZkEVM:mainnet": "npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network mainnet",
- "verify:deployer:ZkEVM:mainnet": "npx hardhat run deployment/verifyzkEVMDeployer.js --network mainnet",
- "deploy:ZkEVM:mainnet": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network mainnet && npm run saveDeployment:mainnet",
- "upgrade:timelock:mainnet": "npx hardhat run upgrade/timeLockUpgrade.js --network mainnet",
- "verify:ZkEVM:mainnet": "npx hardhat run deployment/verifyContracts.js --network mainnet",
- "lint": "npx eslint ./test && npx eslint ./docker/scripts && npx eslint ./deployment && npx eslint ./src",
- "lint:fix": "npx eslint ./test --fix && npx eslint ./docker/scripts --fix && npx eslint ./deployment --fix && npx eslint ./src --fix",
- "compile": "npx hardhat compile",
- "docker:contracts": "./docker/scripts/v2/deploy-docker.sh",
- "dockerv2:contracts": "sudo ./docker/scripts/v2/deploy-dockerv2.sh",
- "push:docker:contracts": "docker push hermeznetwork/geth-zkevm-contracts",
- "update:genesis": "node deployment/1_createGenesis.js && node deployment/1_createGenesis.js --test --input ../docker/scripts/deploy_parameters_docker.json --out ../docker/scripts/genesis_docker.json",
- "coverage": "npx hardhat coverage --testfiles \"test/contractsv2/*.ts\"",
- "gas:report": "REPORT_GAS=true npx hardhat test",
- "gas:report:file": "rm -f .openzeppelin/unknown-*.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test",
- "deploy:v2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost",
- "deploy:testnet:v2:localhost": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost",
- "deploy:v2:goerli": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli",
- "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli",
- "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli",
- "prepare:testnet:ZkEVM:sepolia": "npx hardhat run deployment/testnet/prepareTestnet.ts --network sepolia",
- "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia",
- "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia",
- "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia",
- "prepare:testV1ToV2:ZkEVM:localhost": "npx hardhat run deployment/testV1ToV2/prepareTestnet.ts --network localhost",
- "deploy:testV1ToV2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/testV1ToV2/1_createGenesis.ts --test && npx hardhat run deployment/testV1ToV2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/testV1ToV2/3_deployContracts.ts --network localhost",
- "deploy:testnet:testV1ToV2:localhost": "npx hardhat compile && rm -f deployment/testV1ToV2/deploy_ongoing.json && npm run prepare:testV1ToV2:ZkEVM:localhost && npm run deploy:testV1ToV2:localhost",
- "docker:testV1ToV2:contracts": "./docker/scripts/testV1ToV2/deploy-docker.sh",
- "dockerv2:testV1ToV2:contracts": "sudo ./docker/scripts/testV1ToV2/deploy-dockerv2.sh",
- "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)",
- "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia",
- "testnetPol:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network goerli",
- "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli && npm run saveUpgradeV2:goerli",
- "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia && npm run saveUpgradeV2:sepolia",
- "verify:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network sepolia",
- "verify:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network goerli",
- "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet",
- "saveUpgradeV2:sepolia": "mkdir -p upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json upgrade/upgradeToV2/sepolia_$(date +%s)",
- "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)",
- "upgradev2L2:timelock:polygonZKEVMTestnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMTestnet",
- "upgradev2L2:timelock:polygonZKEVMMainnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMMainnet",
- "upgradev2:timelock:mainnet": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network mainnet && npm run saveUpgradeV2:mainnet",
- "verify:upgradeV2:mainnet": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network mainnet",
- "saveUpgradeV2:mainnet": "mkdir -p upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json upgrade/upgradeToV2/mainnet_$(date +%s)"
- }
+ "name": "@0xpolygonhermez/zkevm-contracts",
+ "description": "Core contracts for the Polygon Hermez zkEVM.",
+ "version": "3.0.0",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/0xPolygonHermez/contracts-zkEVM.git"
+ },
+ "main": "index.js",
+ "keywords": [
+ "zkevm",
+ "snark",
+ "polygon",
+ "hermez",
+ "stark",
+ "EVM",
+ "ethereum",
+ "blockchain"
+ ],
+ "author": "0xPolygonHermez",
+ "files": [
+ "contracts",
+ "index.js",
+ "compiled-contracts",
+ "src"
+ ],
+ "bugs": {
+ "url": "https://github.com/0xPolygonHermez/contracts-zkEVM/issues"
+ },
+ "homepage": "https://github.com/0xPolygonHermez/contracts-zkEVM#readme",
+ "license": "pending",
+ "devDependencies": {
+ "@0xpolygonhermez/zkevm-commonjs": "github:0xPolygonHermez/zkevm-commonjs#v8.0.0-fork.12",
+ "@nomicfoundation/hardhat-toolbox": "^3.0.0",
+ "@openzeppelin/contracts": "4.8.2",
+ "shelljs": "^0.8.5",
+ "@openzeppelin/contracts-upgradeable": "4.8.2",
+ "@openzeppelin/contracts5": "npm:@openzeppelin/contracts@5.0.0",
+ "@openzeppelin/hardhat-upgrades": "^2.5.1",
+ "@types/yargs": "^17.0.28",
+ "circomlibjs": "0.1.1",
+ "dotenv": "^8.6.0",
+ "eslint": "^8.51.0",
+ "eslint-config-airbnb-base": "^15.0.0",
+ "eslint-plugin-mocha": "^9.0.0",
+ "ethereum-waffle": "^3.4.4",
+ "ffjavascript": "^0.2.60",
+ "hardhat": "^2.22.3",
+ "hardhat-dependency-compiler": "^1.1.3",
+ "hardhat-switch-network": "^1.2.0",
+ "lodash": "^4.17.21",
+ "prettier": "^2.8.8",
+ "prettier-plugin-solidity": "^1.4.1",
+ "solc-0.8": "npm:solc@0.8.20",
+ "solc-0.8.17": "npm:solc@0.8.17",
+ "solidity-docgen": "^0.5.17",
+ "winston": "^3.17.0"
+ },
+ "scripts": {
+ "saveDeployment:goerli": "mkdir -p deployments/goerli_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/goerli_$(date +%s) && cp .openzeppelin/goerli.json deployments/goerli_$(date +%s) && cp deployment/v2/genesis.json deployments/goerli_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/goerli_$(date +%s)",
+ "saveDeployment:mainnet": "mkdir -p deployments/mainnet_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json deployments/mainnet_$(date +%s) && cp deployment/v2/genesis.json deployments/mainnet_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/mainnet_$(date +%s)",
+ "test": "npx hardhat test test/contractsv2/*ts test/contractsv2/real-prover-sp1/*.ts test/src/*.ts",
+ "docgen": "npx solidity-docgen --solc-module solc-0.8 -t ./docs/templates -e ./contracts/verifiers,./contracts/mocks,./contracts/token-wrapped-bridge-compiled",
+ "docgen:0.8.17": "npx solidity-docgen --solc-module solc-0.8.17 -t ./docs/templates -i ./contracts/token-wrapped-bridge-compiled -o ./docs/token-wrapped-bridge",
+ "prepare:testnet:ZkEVM:localhost": "npx hardhat run deployment/testnet/prepareTestnet.ts --network localhost",
+ "deploy:ZkEVM:localhost": "rm -f .openzeppelin/unknown-*.json && node deployment/1_createGenesis.js && npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network localhost && npx hardhat run deployment/3_deployContracts.js --network localhost",
+ "deploy:testnet:ZkEVM:localhost": "npm run prepare:testnet:ZkEVM:localhost && npm run deploy:ZkEVM:localhost",
+ "prepare:testnet:ZkEVM:goerli": "npx hardhat run deployment/testnet/prepareTestnet.ts --network goerli",
+ "deploy:ZkEVM:goerli": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network goerli && npm run saveDeployment:goerli",
+ "deploy:deployer:ZkEVM:goerli": "npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network goerli",
+ "verify:deployer:ZkEVM:goerli": "npx hardhat run deployment/verifyzkEVMDeployer.js --network goerli",
+ "deploy:testnet:ZkEVM:goerli": "npm run prepare:testnet:ZkEVM:goerli && npm run deploy:ZkEVM:goerli",
+ "upgrade:timelock:goerli": "npx hardhat run upgrade/timeLockUpgrade.js --network goerli",
+ "verify:ZkEVM:goerli": "npx hardhat run deployment/verifyContracts.js --network goerli",
+ "deploy:deployer:ZkEVM:mainnet": "npx hardhat run deployment/2_deployPolygonZKEVMDeployer.js --network mainnet",
+ "verify:deployer:ZkEVM:mainnet": "npx hardhat run deployment/verifyzkEVMDeployer.js --network mainnet",
+ "deploy:ZkEVM:mainnet": "node deployment/1_createGenesis.js && npx hardhat run deployment/3_deployContracts.js --network mainnet && npm run saveDeployment:mainnet",
+ "upgrade:timelock:mainnet": "npx hardhat run upgrade/timeLockUpgrade.js --network mainnet",
+ "verify:ZkEVM:mainnet": "npx hardhat run deployment/verifyContracts.js --network mainnet",
+ "lint": "npx eslint ./test && npx eslint ./docker/scripts && npx eslint ./deployment && npx eslint ./src",
+ "lint:fix": "npx eslint ./test --fix && npx eslint ./docker/scripts --fix && npx eslint ./deployment --fix && npx eslint ./src --fix",
+ "compile": "npx hardhat compile",
+ "docker:contracts": "./docker/scripts/v2/deploy-docker.sh",
+ "dockerv2:contracts": "./docker/scripts/v2/deploy-dockerv2.sh",
+ "docker:tests": "./docker/scripts/v2/tests-docker.sh",
+ "push:docker:contracts": "docker push hermeznetwork/geth-zkevm-contracts",
+ "update:genesis": "node deployment/1_createGenesis.js && node deployment/1_createGenesis.js --test --input ../docker/scripts/deploy_parameters_docker.json --out ../docker/scripts/genesis_docker.json",
+ "coverage": "npx hardhat coverage --testfiles \"test/contractsv2/*.ts\"",
+ "gas:report": "REPORT_GAS=true npx hardhat test",
+ "gas:report:file": "rm -f .openzeppelin/unknown-*.json && REPORT_GAS=true REPORT_GAS_FILE=true npx hardhat test",
+ "deploy:v2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/v2/1_createGenesis.ts --test && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/v2/3_deployContracts.ts --network localhost && npx hardhat run deployment/v2/4_createRollup.ts --network localhost",
+ "deploy:testnet:v2:localhost": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:localhost && npm run deploy:v2:localhost",
+ "deploy:v2:goerli": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network goerli && npx hardhat run deployment/v2/3_deployContracts.ts --network goerli && npx hardhat run deployment/v2/4_createRollup.ts --network goerli && npm run saveDeployment:goerli",
+ "deploy:testnet:v2:goerli": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:goerli && npm run deploy:v2:goerli",
+ "verify:v2:goerli": "npx hardhat run deployment/v2/verifyContracts.js --network goerli",
+ "prepare:testnet:ZkEVM:sepolia": "npx hardhat run deployment/testnet/prepareTestnet.ts --network sepolia",
+ "deploy:v2:sepolia": "npx hardhat compile && npx ts-node deployment/v2/1_createGenesis.ts && npx hardhat run deployment/v2/2_deployPolygonZKEVMDeployer.ts --network sepolia && npx hardhat run deployment/v2/3_deployContracts.ts --network sepolia && npx hardhat run deployment/v2/4_createRollup.ts --network sepolia && npm run saveDeployment:sepolia",
+ "deploy:testnet:v2:sepolia": "npx hardhat compile && rm -f deployment/v2/deploy_ongoing.json && npm run prepare:testnet:ZkEVM:sepolia && npm run deploy:v2:sepolia",
+ "verify:v2:sepolia": "npx hardhat run deployment/v2/verifyContracts.js --network sepolia",
+ "prepare:testV1ToV2:ZkEVM:localhost": "npx hardhat run deployment/testV1ToV2/prepareTestnet.ts --network localhost",
+ "deploy:testV1ToV2:localhost": "npx hardhat compile && rm -f .openzeppelin/unknown-*.json && npx ts-node deployment/testV1ToV2/1_createGenesis.ts --test && npx hardhat run deployment/testV1ToV2/2_deployPolygonZKEVMDeployer.ts --network localhost && npx hardhat run deployment/testV1ToV2/3_deployContracts.ts --network localhost",
+ "deploy:testnet:testV1ToV2:localhost": "npx hardhat compile && rm -f deployment/testV1ToV2/deploy_ongoing.json && npm run prepare:testV1ToV2:ZkEVM:localhost && npm run deploy:testV1ToV2:localhost",
+ "docker:testV1ToV2:contracts": "./docker/scripts/testV1ToV2/deploy-docker.sh",
+ "dockerv2:testV1ToV2:contracts": "sudo ./docker/scripts/testV1ToV2/deploy-dockerv2.sh",
+ "saveDeployment:sepolia": "mkdir -p deployments/sepolia_$(date +%s) && cp -r deployment/v2/deploy_*.json deployments/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json deployments/sepolia_$(date +%s) && cp deployment/v2/genesis.json deployments/sepolia_$(date +%s) && cp deployment/v2/create_rollup_output.json deployments/sepolia_$(date +%s)",
+ "testnetPol:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network sepolia",
+ "testnetPol:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/testnet/deployTestnetPol.ts --network goerli",
+ "upgradev2:timelock:goerli": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network goerli && npm run saveUpgradeV2:goerli",
+ "upgradev2:timelock:sepolia": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network sepolia && npm run saveUpgradeV2:sepolia",
+ "verify:upgradeV2:sepolia": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network sepolia",
+ "verify:upgradeV2:goerli": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network goerli",
+ "upgradev2L2:timelock:zkevmDevnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network zkevmDevnet",
+ "saveUpgradeV2:sepolia": "mkdir -p upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/sepolia_$(date +%s) && cp .openzeppelin/sepolia.json upgrade/upgradeToV2/sepolia_$(date +%s)",
+ "saveUpgradeV2:goerli": "mkdir -p upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/goerli_$(date +%s) && cp .openzeppelin/goerli.json upgrade/upgradeToV2/goerli_$(date +%s)",
+ "upgradev2L2:timelock:polygonZKEVMTestnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMTestnet",
+ "upgradev2L2:timelock:polygonZKEVMMainnet": "npx hardhat run upgrade/upgradeToV2/upgradeL2ToV2.ts --network polygonZKEVMMainnet",
+ "upgradev2:timelock:mainnet": "npx hardhat run upgrade/upgradeToV2/upgradeToV2.ts --network mainnet && npm run saveUpgradeV2:mainnet",
+ "verify:upgradeV2:mainnet": "npx hardhat run upgrade/upgradeToV2/verifyContracts.ts --network mainnet",
+ "saveUpgradeV2:mainnet": "mkdir -p upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/upgrade_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp -r upgrade/upgradeToV2/deploy_*.json upgrade/upgradeToV2/mainnet_$(date +%s) && cp .openzeppelin/mainnet.json upgrade/upgradeToV2/mainnet_$(date +%s)"
+ }
}
\ No newline at end of file
diff --git a/src/constants.js b/src/constants.js
new file mode 100644
index 000000000..941fbbe64
--- /dev/null
+++ b/src/constants.js
@@ -0,0 +1,43 @@
+const ethers = require('ethers');
+
+/// /////////////////////////////////
+/// TIMELOCK CONSTANTS /////////
+/// /////////////////////////////////
+const TIMELOCK = {};
+module.exports.TIMELOCK = TIMELOCK;
+/*
+ * Since roles are used, most storage is written in pseudoRandom storage slots
+ * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE");
+ * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
+ * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
+ * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE");
+ * note: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/governance/TimelockController.sol#L27
+ */
+TIMELOCK.ROLES = {
+ TIMELOCK_ADMIN_ROLE: ethers.id('TIMELOCK_ADMIN_ROLE'),
+ PROPOSER_ROLE: ethers.id('PROPOSER_ROLE'),
+ EXECUTOR_ROLE: ethers.id('EXECUTOR_ROLE'),
+ CANCELLER_ROLE: ethers.id('CANCELLER_ROLE'),
+};
+
+TIMELOCK.ROLES_HASH = [
+ ethers.id('TIMELOCK_ADMIN_ROLE'),
+ ethers.id('PROPOSER_ROLE'),
+ ethers.id('EXECUTOR_ROLE'),
+ ethers.id('CANCELLER_ROLE'),
+];
+
+/*
+ * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/governance/TimelockController.sol#L27
+ * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/access/AccessControl.sol#L55
+ */
+TIMELOCK.ROLES_MAPPING_STORAGE_POS = 0;
+
+// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/governance/TimelockController.sol#L34
+TIMELOCK.MINDELAY_STORAGE_POS = 2;
+
+/// /////////////////////////////////
+/// STORAGE CONSTANTS //////////
+/// /////////////////////////////////
+module.exports.STORAGE_ONE_VALUE = '0x0000000000000000000000000000000000000000000000000000000000000001';
+module.exports.STORAGE_ZERO_VALUE = '0x0000000000000000000000000000000000000000000000000000000000000000';
diff --git a/src/create-genesis.js b/src/create-genesis-old.js
similarity index 100%
rename from src/create-genesis.js
rename to src/create-genesis-old.js
diff --git a/src/genesis/genesis-helpers.js b/src/genesis/genesis-helpers.js
new file mode 100644
index 000000000..b3500e7ec
--- /dev/null
+++ b/src/genesis/genesis-helpers.js
@@ -0,0 +1,65 @@
+const ethers = require('ethers');
+
+const { TIMELOCK, STORAGE_ONE_VALUE } = require('../constants');
+const { valueToStorageBytes } = require('../utils');
+
+function setupRole(storage, address, roleHash) {
+ const storagePosition = ethers.solidityPackedKeccak256(
+ ['uint256', 'uint256'],
+ [roleHash, TIMELOCK.ROLES_MAPPING_STORAGE_POS],
+ );
+
+ const storagePositionRole = ethers.solidityPackedKeccak256(
+ ['uint256', 'uint256'],
+ [address, storagePosition],
+ );
+
+ storage[storagePositionRole] = STORAGE_ONE_VALUE;
+}
+
+/**
+ * This function aims to compute te storage when the timelock is deployed
+ * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/governance/TimelockController.sol#L77
+ * @param {number} minDelay - Minimum delay for the timelock
+ * @param {string} adminAddress - Grant admin, proposer, executor and canceller roles to this address
+ * @param {string} timelockAddress - Grant admin to this address
+ * @returns {Object} - Timelock storage slots
+ */
+function initializeTimelockStorage(minDelay, adminAddress, timelockAddress) {
+ const storage = {};
+
+ // set TIMELOCK_ADMIN_ROLE as an adminRole to all timelock roles
+ for (let i = 0; i < TIMELOCK.ROLES_HASH.length; i++) {
+ const storagePosition = ethers.solidityPackedKeccak256(
+ ['uint256', 'uint256'],
+ [TIMELOCK.ROLES_HASH[i], TIMELOCK.ROLES_MAPPING_STORAGE_POS],
+ );
+
+ // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.8.2/contracts/access/AccessControl.sol#L52
+ const roleAdminSlot = ethers.zeroPadValue(ethers.toQuantity(ethers.toBigInt(storagePosition) + BigInt(1)), 32);
+
+ storage[roleAdminSlot] = TIMELOCK.ROLES.TIMELOCK_ADMIN_ROLE;
+ }
+
+ // Self administration
+ setupRole(storage, timelockAddress, TIMELOCK.ROLES.TIMELOCK_ADMIN_ROLE);
+
+ // admin tole
+ setupRole(storage, adminAddress, TIMELOCK.ROLES.TIMELOCK_ADMIN_ROLE);
+
+ // register proposers and cancellers
+ setupRole(storage, adminAddress, TIMELOCK.ROLES.PROPOSER_ROLE);
+ setupRole(storage, adminAddress, TIMELOCK.ROLES.CANCELLER_ROLE);
+
+ // register executors
+ setupRole(storage, adminAddress, TIMELOCK.ROLES.EXECUTOR_ROLE);
+
+ // set minDelay
+ storage[valueToStorageBytes(TIMELOCK.MINDELAY_STORAGE_POS)] = valueToStorageBytes(minDelay);
+
+ return storage;
+}
+
+module.exports = {
+ initializeTimelockStorage,
+};
diff --git a/src/logger.js b/src/logger.js
new file mode 100644
index 000000000..cc70244fb
--- /dev/null
+++ b/src/logger.js
@@ -0,0 +1,16 @@
+const winston = require('winston');
+
+// Create Winston logger with console transport only
+const logger = winston.createLogger({
+ level: 'debug', // Set log level (error, warn, info, debug)
+ format: winston.format.combine(
+ winston.format.colorize(), // Adds color to console logs
+ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // Adds timestamp
+ winston.format.printf(({ timestamp, level, message }) => `${timestamp} [${level}]: ${message}`), // Custom format
+ ),
+ transports: [
+ new winston.transports.Console(), // Logs only to the terminal
+ ],
+});
+
+module.exports.logger = logger;
diff --git a/src/pessimistic-utils.js b/src/pessimistic-utils.js
new file mode 100644
index 000000000..a1c0bdac3
--- /dev/null
+++ b/src/pessimistic-utils.js
@@ -0,0 +1,70 @@
+const ethers = require('ethers');
+
+const VerifierType = {
+ StateTransition: 0,
+ Pessimistic: 1,
+};
+
+const ConsensusTypes = {
+ Ecdsa: 0,
+};
+
+const ConsensusContracts = {
+ PolygonZkEVMEtrog: 'PolygonZkEVMEtrog',
+ PolygonValidiumEtrog: 'PolygonValidiumEtrog',
+ PolygonPessimisticConsensus: 'PolygonPessimisticConsensus',
+
+};
+/**
+ * Compute input for SNARK circuit: sha256(
+ * initStateRoot, initBlobStateRoot, initBlobAccInputHash, initNumBlob, chainId, forkID
+ * finalStateRoot, finalBlobStateRoot, finalBlobAccInputHash, finalNumBlob, finalLocalExitRoot
+ * aggregatorAddress
+ * ) % FrSNARK
+ * @param {String} lastLocalExitRoot - old LER
+ * @param {String} lastPessimisticRoot - old pessimistic root. pessRoor = Poseidon(LBR # nullifierRoot)
+ * @param {String} l1InfoTreeRoot - L1 info tree root
+ * @param {Number} rollupID - rollup identifier (networkID = rollupID - 1)
+ * @param {String} consensusHash - consensus hash. consensusHash = Sha(consensusType # consensusPayload)
+ * @param {String} newLocalExitRoot - new LER
+ * @param {String} newPessimisticRoot - new pessimistic root
+ */
+function computeInputPessimisticBytes(
+ lastLocalExitRoot,
+ lastPessimisticRoot,
+ l1InfoTreeRoot,
+ rollupID,
+ consensusHash,
+ newLocalExitRoot,
+ newPessimisticRoot,
+) {
+ return ethers.solidityPacked(
+ ['bytes32', 'bytes32', 'bytes32', 'uint32', 'bytes32', 'bytes32', 'bytes32'],
+ [
+ lastLocalExitRoot,
+ lastPessimisticRoot,
+ l1InfoTreeRoot,
+ rollupID,
+ consensusHash,
+ newLocalExitRoot,
+ newPessimisticRoot,
+ ],
+ );
+}
+
+/**
+ * Computes consensus hash
+ * @param address - Signer of the message in the pessimsistic proof
+ * @returns consensus hash
+ */
+function computeConsensusHashEcdsa(address) {
+ return ethers.solidityPackedKeccak256(['uint32', 'address'], [ConsensusTypes.Ecdsa, address]);
+}
+
+module.exports = {
+ VerifierType,
+ ConsensusTypes,
+ computeInputPessimisticBytes,
+ computeConsensusHashEcdsa,
+ ConsensusContracts,
+};
diff --git a/src/utils.js b/src/utils.js
new file mode 100644
index 000000000..44185218a
--- /dev/null
+++ b/src/utils.js
@@ -0,0 +1,99 @@
+const { Scalar } = require('ffjavascript');
+
+/**
+ * Check if all params are present in the expectedParams
+ * @param {Object} objParams - object with parameters
+ * @param {Array} expectedParams - array of expected parameters in string
+ */
+function checkParams(objParams, expectedParams) {
+ // eslint-disable-next-line no-restricted-syntax
+ for (const parameterName of expectedParams) {
+ if (objParams[parameterName] === undefined || objParams[parameterName] === '') {
+ throw new Error(`Missing parameter: ${parameterName}`);
+ }
+ }
+}
+
+/**
+ * Convert a value into in its hexadecimal string representation
+ * @param {Number | BigInt} _value - value to encode
+ * @param {Boolean} prefix - attach '0x' at the beginning of the string
+ * @returns {String} encoded value in hexadecimal string
+ */
+function valueToHexStr(_value, prefix = false) {
+ if (!(typeof _value === 'number' || typeof _value === 'bigint')) {
+ throw new Error('valueToHexStr: _value is not a number or BigInt type');
+ }
+
+ if (prefix !== false && typeof prefix !== 'boolean') {
+ throw new Error('valueToHexStr: _prefix is not a boolean');
+ }
+
+ let valueHex = Scalar.e(_value).toString(16);
+ valueHex = valueHex.length % 2 ? `0${valueHex}` : valueHex;
+
+ return prefix ? `0x${valueHex}` : valueHex;
+}
+
+/**
+ * Pad a string hex number with 0
+ * @param {String} str - String input
+ * @param {Number} length - Length of the resulting string
+ * @returns {String} Resulting string
+ */
+function padZeros(str, length) {
+ if (length > str.length) {
+ str = '0'.repeat(length - str.length) + str;
+ }
+
+ return str;
+}
+
+/**
+ * Convert a value into in its hexadecimal string representation with 32 bytes padding
+ * @param {Number | BigInt} _value - value to encode
+ * @returns {String} encoded value in hexadecimal string
+ */
+function valueToStorageBytes(_value) {
+ const valueHex = valueToHexStr(_value, false);
+ return `0x${padZeros(valueHex, 64)}`;
+}
+
+/**
+ * Scan all SSTORE opcodes in a trace
+ * Does not take into account revert operations neither depth
+ * @param {Object} trace
+ * @returns {Object} - storage writes: {"key": "value"}
+ */
+function getStorageWrites(trace) {
+ const writes = trace.structLogs
+ .filter((log) => log.op === 'SSTORE')
+ .map((log) => {
+ const [newValue, slot] = log.stack.slice(-2);
+ return { newValue, slot };
+ });
+
+ // print all storage writes in an object fashion style
+ const writeObject = {};
+ writes.forEach((write) => {
+ writeObject[`0x${write.slot}`] = `0x${write.newValue}`;
+ });
+
+ return writeObject;
+}
+
+/**
+ * Get all SLOAD and SSTORE in a trace
+ * @param {Object} trace
+ * @returns {Object} - storage read and writes: {"key": "value"}
+ */
+function getStorageReadWrites(trace) {
+ return trace.structLogs[trace.structLogs.length - 1].storage;
+}
+
+module.exports = {
+ getStorageWrites,
+ getStorageReadWrites,
+ valueToStorageBytes,
+ checkParams,
+};
diff --git a/test/contractsv2/BridgeL2GasTokenMappedSovereignChains.test.ts b/test/contractsv2/BridgeL2GasTokenMappedSovereignChains.test.ts
new file mode 100644
index 000000000..5ad44a2ea
--- /dev/null
+++ b/test/contractsv2/BridgeL2GasTokenMappedSovereignChains.test.ts
@@ -0,0 +1,1562 @@
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ ERC20PermitMock,
+ GlobalExitRootManagerL2SovereignChain,
+ BridgeL2SovereignChain,
+ TokenWrapped,
+} from "../../typechain-types";
+import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers";
+import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs";
+const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils;
+const MerkleTreeBridge = MTBridge;
+const {verifyMerkleProof, getLeafValue} = mtBridgeUtils;
+import {setBalance} from "@nomicfoundation/hardhat-network-helpers";
+
+function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) {
+ return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]);
+}
+const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n;
+
+function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) {
+ if (isMainnet === true) {
+ return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG;
+ } else {
+ return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n;
+ }
+}
+
+describe("SovereignChainBridge Gas tokens tests", () => {
+ upgrades.silenceWarnings();
+
+ let sovereignChainBridgeContract: BridgeL2SovereignChain;
+ let polTokenContract: ERC20PermitMock;
+ let sovereignChainGlobalExitRoot: GlobalExitRootManagerL2SovereignChain;
+
+ let deployer: any;
+ let rollupManager: any;
+ let acc1: any;
+ let bridgeManager: any;
+
+ const tokenName = "Matic Token";
+ const tokenSymbol = "MATIC";
+ const decimals = 18;
+ const tokenInitialBalance = ethers.parseEther("20000000");
+ const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [tokenName, tokenSymbol, decimals]
+ );
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+ const networkIDRollup2 = 2;
+
+ const LEAF_TYPE_ASSET = 0;
+ const LEAF_TYPE_MESSAGE = 1;
+
+ let gasTokenAddress: any;
+ let gasTokenNetwork: any;
+ let gasTokenMetadata: any;
+ let WETHToken: TokenWrapped;
+
+ beforeEach("Deploy contracts", async () => {
+ // load signers
+ [deployer, rollupManager, acc1, bridgeManager] = await ethers.getSigners();
+
+ // Set trusted sequencer as coinbase for sovereign chains
+ await ethers.provider.send("hardhat_setCoinbase", [deployer.address]);
+ // deploy PolygonZkEVMBridge
+ const BridgeL2SovereignChainFactory = await ethers.getContractFactory("BridgeL2SovereignChain");
+ sovereignChainBridgeContract = (await upgrades.deployProxy(BridgeL2SovereignChainFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ })) as unknown as BridgeL2SovereignChain;
+
+ // deploy global exit root manager
+ const SovereignChainGlobalExitRootFactory = await ethers.getContractFactory(
+ "GlobalExitRootManagerL2SovereignChain"
+ );
+ sovereignChainGlobalExitRoot = await SovereignChainGlobalExitRootFactory.deploy(
+ sovereignChainBridgeContract.target
+ );
+
+ // deploy weth token by bridge
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ WETHToken = await tokenWrappedFactory
+ .connect(bridgeMock)
+ .deploy(tokenName, tokenSymbol, decimals, {gasPrice: 0});
+
+ gasTokenAddress = polTokenContract.target;
+ gasTokenNetwork = 0;
+ gasTokenMetadata = metadataToken;
+
+ await sovereignChainBridgeContract.initialize(
+ networkIDRollup2,
+ polTokenContract.target, // zero for ether
+ 0, // zero for ether
+ sovereignChainGlobalExitRoot.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ WETHToken.target,
+ false,
+ );
+ expect(await sovereignChainBridgeContract.WETHToken()).to.be.equal(WETHToken.target);
+ });
+
+ it("should claim message from not mintable remapped gas (WETH) token", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDRollup;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // deploy sovereign
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ const sovereignToken = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRoot.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+ // Remap weth token
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).setSovereignWETHAddress(sovereignToken.target, true)
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignWETHAddress")
+ .withArgs(sovereignToken.target, true);
+ // try claim without balance to transfer (from bridge)
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.revertedWith("ERC20: transfer amount exceeds balance");
+ // Transfer tokens to bridge
+ await sovereignToken.transfer(sovereignChainBridgeContract.target, amount);
+ const balanceBridge = await sovereignToken.balanceOf(sovereignChainBridgeContract.target);
+
+ // Check balances before claim
+ expect(balanceBridge).to.be.equal(amount);
+ // Claim message
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, sovereignToken.target, destinationAddress, amount);
+
+ // Check balances after claim
+ expect(await sovereignToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(ethers.parseEther("0"));
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should check the constructor parameters", async () => {
+ expect(await sovereignChainBridgeContract.globalExitRootManager()).to.be.equal(
+ sovereignChainGlobalExitRoot.target
+ );
+ expect(await sovereignChainBridgeContract.networkID()).to.be.equal(networkIDRollup2);
+ expect(await sovereignChainBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address);
+
+ expect(await sovereignChainBridgeContract.gasTokenAddress()).to.be.equal(gasTokenAddress);
+ expect(await sovereignChainBridgeContract.gasTokenNetwork()).to.be.equal(gasTokenNetwork);
+ expect(await sovereignChainBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata);
+ });
+
+ it("should SovereignChain bridge asset and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignRollup = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: 1}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "MsgValueNotZero");
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSSovereignRollup);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+ });
+
+ it("should PolygonZkEVMBridge message and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const originAddress = deployer.address;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignChain = merkleTree.getRoot();
+
+ // using gas TOkens cannot use bridge message with etther
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {
+ value: amount,
+ })
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks");
+
+ // Use bridgeMessageWETH instead!
+
+ // cannot use value
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata,
+ {
+ value: amount,
+ }
+ )
+ ).to.be.reverted;
+
+ // Use bridgeMessageWETH instead!
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata
+ )
+ ).to.be.revertedWith("ERC20: burn amount exceeds balance");
+
+ // Mock mint weth
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain)
+ ).to.be.equal(true);
+
+ // bridge message without value is fine
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {})
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ 0,
+ metadata,
+ depositCount + 1n
+ );
+ });
+
+ it("should SovereignChain bridge asset and message to check global exit root updates", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignChain = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ false,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(0);
+ expect(mainnetExitRoot).to.be.equal(ethers.ZeroHash);
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain);
+
+ // Update global exit root
+ await expect(sovereignChainBridgeContract.updateGlobalExitRoot());
+
+ // no state changes since there are not any deposit pending to be updated
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+ expect(mainnetExitRoot).to.be.equal(mainnetExitRoot);
+
+ // bridge message
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, {
+ value: amount,
+ })
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks");
+
+ // Mock mint weth
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ false,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ deployer.address,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ 1
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+ expect(mainnetExitRoot).to.be.equal(mainnetExitRoot);
+
+ // Update global exit root
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(2);
+ expect(mainnetExitRoot).to.not.be.equal(rootJSSovereignChain);
+
+ // Just to have the metric of a low cost bridge Asset
+ const tokenAddress2 = WETHToken.target; // Ether
+ const amount2 = ethers.parseEther("10");
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount2, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount2,
+ tokenAddress2,
+ false,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ 0, // weth bridge
+ ethers.ZeroAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount2,
+ "0x",
+ 2
+ )
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(deployer.address, ethers.ZeroAddress, amount2);
+ });
+
+ it("should claim Gas tokens from SovereignChain to SovereignChain", async () => {
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = acc1.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+ const indexRollup = 5;
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ if (i == indexRollup) {
+ merkleTreeRollup.add(rootLocalRollup);
+ } else {
+ merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32));
+ }
+ }
+ const rootRollup = merkleTreeRollup.getRoot();
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRoot,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const sovereignChainExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(sovereignChainExitRootSC).to.be.equal(rootRollup);
+ const mainnetExitRootSC = ethers.ZeroHash;
+ expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootRollup);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof rollup
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ /*
+ * claim
+ * Can't claim without native (ether)
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ rootLocalRollup,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.reverted;
+
+ await setBalance(sovereignChainBridgeContract.target as any, amount);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ const initialBalance = await ethers.provider.getBalance(sovereignChainBridgeContract.target);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ {
+ gasPrice: 0,
+ }
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ expect(initialBalance - amount).to.be.equal(
+ await ethers.provider.getBalance(sovereignChainBridgeContract.target)
+ );
+ });
+
+ it("should claim tokens from SovereignChain to SovereignChain2", async () => {
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ merkleTreeRollup.add(rootLocalRollup);
+ }
+
+ const rootRollup = merkleTreeRollup.getRoot();
+
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRoot.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRoot,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rootRollup);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof local
+ const indexRollup = 5;
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)
+ ).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ // claim
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ // create2 parameters
+ const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]);
+ const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
+ const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]);
+ const precalculateWrappedErc20 = await ethers.getCreate2Address(
+ sovereignChainBridgeContract.target as string,
+ salt,
+ hashInitCode
+ );
+ const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped;
+
+ // Use precalculatedWrapperAddress and check if matches
+ expect(
+ await sovereignChainBridgeContract.precalculatedWrapperAddress(
+ networkIDRollup,
+ tokenAddress,
+ tokenName,
+ tokenSymbol,
+ decimals
+ )
+ ).to.be.equal(precalculateWrappedErc20);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(sovereignChainBridgeContract, "NewWrappedToken")
+ .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ const newTokenInfo = await sovereignChainBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20);
+
+ expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup);
+ expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress);
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+
+ expect(await sovereignChainBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20);
+
+ // Check the wrapper info
+ expect(await newWrappedToken.name()).to.be.equal(tokenName);
+ expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol);
+ expect(await newWrappedToken.decimals()).to.be.equal(decimals);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+
+ // Claim again the other leaf to mint tokens
+ const index2 = 1;
+ const proof2 = merkleTreeLocal.getProofTreeByIndex(index2);
+
+ expect(verifyMerkleProof(leafValue, proof2, index2, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rollupExitRootSC)).to.be.equal(true);
+
+ const globalIndex2 = computeGlobalIndex(index2, indexRollup, false);
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proof2,
+ proofRollup,
+ globalIndex2,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ // Burn Tokens
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const wrappedTokenAddress = newWrappedToken.target;
+ const newDestinationNetwork = networkIDRollup;
+
+ const rollupExitRoot = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(newWrappedToken.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(newWrappedToken, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ /*
+ * pre compute root merkle tree in Js
+ * const height = 32;
+ */
+ const merkleTreeMainnet = new MerkleTreeBridge(height);
+ // Imporant calcualte leaf with origin token address no wrapped token address
+ const originTokenAddress = tokenAddress;
+ const metadataMainnet = metadata; // since the token does not belong to this network
+ const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]);
+
+ const leafValueMainnet = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+ const leafValueMainnetSC = await sovereignChainBridgeContract.getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+
+ expect(leafValueMainnet).to.be.equal(leafValueMainnetSC);
+ merkleTreeMainnet.add(leafValueMainnet);
+ const rootJSMainnet = ethers.ZeroHash;
+
+ // Tokens are burnt
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n);
+ expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n);
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ wrappedTokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataMainnet,
+ depositCount
+ )
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(deployer.address, ethers.ZeroAddress, amount);
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(0);
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+
+ // check merkle proof
+ const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0);
+ const indexMainnet = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCSovereignChain)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(
+ leafValueMainnet,
+ proofMainnet,
+ indexMainnet,
+ rootSCSovereignChain
+ )
+ ).to.be.equal(true);
+ });
+
+ it("should PolygonZkEVMBridge and sync the current root with events", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // gasToken
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ // create 3 new deposit
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount + 1n
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount + 2n
+ );
+
+ // Prepare merkle tree
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+
+ // Get the deposit's events
+ const filter = sovereignChainBridgeContract.filters.BridgeEvent(
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined
+ );
+ const events = await sovereignChainBridgeContract.queryFilter(filter, 0, "latest");
+ events.forEach((e) => {
+ const {args} = e;
+ const leafValue = getLeafValue(
+ args.leafType,
+ args.originNetwork,
+ args.originAddress,
+ args.destinationNetwork,
+ args.destinationAddress,
+ args.amount,
+ ethers.solidityPackedKeccak256(["bytes"], [args.metadata])
+ );
+ merkleTree.add(leafValue);
+ });
+
+ // Check merkle root with SC
+ const rootSC = await sovereignChainBridgeContract.getRoot();
+ const rootJS = merkleTree.getRoot();
+
+ expect(rootSC).to.be.equal(rootJS);
+ });
+
+ it("should claim testing all the asserts", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ const globalIndex = computeGlobalIndex(index, index, false);
+ // Can't claim without tokens
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.reverted;
+
+ await setBalance(sovereignChainBridgeContract.target as any, amount);
+
+ // Check GlobalExitRoot invalid assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ mainnetExitRoot,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GlobalExitRootInvalid");
+
+ // Check Invalid smt proof assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex + 1n,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Check Already claimed_claim
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim ether", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ // claim weth
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, deployer.address, amount);
+
+ // Check balances after claim
+ expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await WETHToken.totalSupply()).to.be.equal(amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim message", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRoot.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRoot.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRoot.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRoot, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ /*
+ * claim
+ * Can't claim a message as an assets
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ const balanceDeployer = await ethers.provider.getBalance(deployer.address);
+
+ // Check mainnet destination assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, deployer.address, amount);
+
+ // Check balances after claim
+ expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await WETHToken.totalSupply()).to.be.equal(amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+});
diff --git a/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts b/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts
new file mode 100644
index 000000000..a8189f324
--- /dev/null
+++ b/test/contractsv2/BridgeL2GasTokensSovereignChains.test.ts
@@ -0,0 +1,1603 @@
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ ERC20PermitMock,
+ GlobalExitRootManagerL2SovereignChain,
+ BridgeL2SovereignChain,
+ TokenWrapped,
+} from "../../typechain-types";
+import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers";
+import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs";
+const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils;
+const MerkleTreeBridge = MTBridge;
+const {verifyMerkleProof, getLeafValue} = mtBridgeUtils;
+import {setBalance} from "@nomicfoundation/hardhat-network-helpers";
+
+function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) {
+ return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]);
+}
+const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n;
+
+function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) {
+ if (isMainnet === true) {
+ return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG;
+ } else {
+ return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n;
+ }
+}
+
+describe("SovereignChainBridge Gas tokens tests", () => {
+ upgrades.silenceWarnings();
+
+ let sovereignChainBridgeContract: BridgeL2SovereignChain;
+ let polTokenContract: ERC20PermitMock;
+ let sovereignChainGlobalExitRootContract: GlobalExitRootManagerL2SovereignChain;
+
+ let deployer: any;
+ let rollupManager: any;
+ let acc1: any;
+ let bridgeManager: any;
+
+ const tokenName = "Matic Token";
+ const tokenSymbol = "MATIC";
+ const decimals = 18;
+ const tokenInitialBalance = ethers.parseEther("20000000");
+ const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [tokenName, tokenSymbol, decimals]
+ );
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+ const networkIDRollup2 = 2;
+
+ const LEAF_TYPE_ASSET = 0;
+ const LEAF_TYPE_MESSAGE = 1;
+
+ let gasTokenAddress: any;
+ let gasTokenNetwork: any;
+ let gasTokenMetadata: any;
+ let WETHToken: TokenWrapped;
+
+ beforeEach("Deploy contracts", async () => {
+ // load signers
+ [deployer, rollupManager, acc1, bridgeManager] = await ethers.getSigners();
+
+ // Set trusted sequencer as coinbase for sovereign chains
+ await ethers.provider.send("hardhat_setCoinbase", [deployer.address]);
+ // deploy PolygonZkEVMBridge
+ const BridgeL2SovereignChainFactory = await ethers.getContractFactory("BridgeL2SovereignChain");
+ sovereignChainBridgeContract = (await upgrades.deployProxy(BridgeL2SovereignChainFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ })) as unknown as BridgeL2SovereignChain;
+
+ // deploy global exit root manager
+ const GlobalExitRootManagerL2SovereignChainFactory = await ethers.getContractFactory(
+ "GlobalExitRootManagerL2SovereignChain"
+ );
+ sovereignChainGlobalExitRootContract = (await upgrades.deployProxy(
+ GlobalExitRootManagerL2SovereignChainFactory,
+ [deployer.address, deployer.address], // Initializer params
+ {
+ initializer: "initialize", // initializer function name
+ constructorArgs: [sovereignChainBridgeContract.target], // Constructor arguments
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ }
+ )) as unknown as GlobalExitRootManagerL2SovereignChain;
+
+ // deploy token
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+
+ gasTokenAddress = polTokenContract.target;
+ gasTokenNetwork = 0;
+ gasTokenMetadata = metadataToken;
+
+ await expect(
+ sovereignChainBridgeContract.initialize(
+ networkIDRollup2,
+ polTokenContract.target,
+ 0, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ ethers.ZeroAddress,
+ true, // Not false, revert
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSovereignWETHAddressParams");
+
+ await sovereignChainBridgeContract.initialize(
+ networkIDRollup2,
+ polTokenContract.target, // zero for ether
+ 0, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ ethers.ZeroAddress,
+ false,
+ );
+
+ // calculate the weth address:
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ // create2 parameters
+ const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
+ const WETHName = "Wrapped Ether";
+ const WETHSymbol = "WETH";
+ const WETHDecimals = 18;
+ const metadataWETH = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [WETHName, WETHSymbol, WETHDecimals]
+ );
+
+ const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataWETH]);
+ const precalculatedWeth = await ethers.getCreate2Address(
+ sovereignChainBridgeContract.target as string,
+ ethers.ZeroHash, // salt is zero
+ hashInitCode
+ );
+ WETHToken = tokenWrappedFactory.attach(precalculatedWeth) as TokenWrapped;
+
+ expect(await sovereignChainBridgeContract.WETHToken()).to.be.equal(WETHToken.target);
+ });
+
+ it("should claim message from not mintable remapped gas (WETH) token", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // deploy sovereign
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ const sovereignToken = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+
+ // Try to insert global exit root with non coinbase
+ await expect(
+ sovereignChainGlobalExitRootContract.connect(acc1).insertGlobalExitRoot(computedGlobalExitRoot)
+ ).to.be.revertedWithCustomError(sovereignChainGlobalExitRootContract, "OnlyGlobalExitRootUpdater");
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+ // Remap weth token
+ await expect(sovereignChainBridgeContract.connect(bridgeManager).setSovereignWETHAddress(sovereignToken.target, true))
+ .to.emit(sovereignChainBridgeContract, "SetSovereignWETHAddress")
+ .withArgs(sovereignToken.target, true);
+ // try claim without balance to transfer (from bridge)
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.revertedWith("ERC20: transfer amount exceeds balance");
+ // Transfer tokens to bridge
+ await sovereignToken.transfer(sovereignChainBridgeContract.target, amount);
+ const balanceBridge = await sovereignToken.balanceOf(sovereignChainBridgeContract.target);
+
+ // Check balances before claim
+ expect(balanceBridge).to.be.equal(amount);
+ // Claim message
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, sovereignToken.target, destinationAddress, amount);
+
+ // Check balances after claim
+ expect(await sovereignToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(ethers.parseEther("0"));
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sovereignToken.target,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should check the constructor parameters", async () => {
+ expect(await sovereignChainBridgeContract.globalExitRootManager()).to.be.equal(
+ sovereignChainGlobalExitRootContract.target
+ );
+ expect(await sovereignChainBridgeContract.networkID()).to.be.equal(networkIDRollup2);
+ expect(await sovereignChainBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address);
+
+ expect(await sovereignChainBridgeContract.gasTokenAddress()).to.be.equal(gasTokenAddress);
+ expect(await sovereignChainBridgeContract.gasTokenNetwork()).to.be.equal(gasTokenNetwork);
+ expect(await sovereignChainBridgeContract.gasTokenMetadata()).to.be.equal(gasTokenMetadata);
+ });
+
+ it("should SovereignChain bridge asset and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignRollup = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: 1}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "MsgValueNotZero");
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSSovereignRollup);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+ });
+
+ it("should PolygonZkEVMBridge message and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const originAddress = deployer.address;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignChain = merkleTree.getRoot();
+
+ // using gas TOkens cannot use bridge message with etther
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {
+ value: amount,
+ })
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks");
+
+ // Use bridgeMessageWETH instead!
+
+ // cannot use value
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata,
+ {
+ value: amount,
+ }
+ )
+ ).to.be.reverted;
+
+ // Use bridgeMessageWETH instead!
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata
+ )
+ ).to.be.revertedWith("ERC20: burn amount exceeds balance");
+
+ // Mock mint weth
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ true,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCSovereignChain)
+ ).to.be.equal(true);
+
+ // bridge message without value is fine
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {})
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ 0,
+ metadata,
+ depositCount + 1n
+ );
+ });
+
+ it("should SovereignChain bridge asset and message to check global exit root updates", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSSovereignChain = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ false,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(0);
+ expect(mainnetExitRoot).to.be.equal(ethers.ZeroHash);
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCSovereignChain).to.be.equal(rootJSSovereignChain);
+
+ // Update global exit root
+ await expect(sovereignChainBridgeContract.updateGlobalExitRoot());
+
+ // no state changes since there are not any deposit pending to be updated
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+ expect(mainnetExitRoot).to.be.equal(mainnetExitRoot);
+
+ // bridge message
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, {
+ value: amount,
+ })
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NoValueInMessagesOnGasTokenNetworks");
+
+ // Mock mint weth
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ false,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ deployer.address,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ 1
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+ expect(mainnetExitRoot).to.be.equal(mainnetExitRoot);
+
+ // Update global exit root
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(2);
+ expect(mainnetExitRoot).to.not.be.equal(rootJSSovereignChain);
+
+ // Just to have the metric of a low cost bridge Asset
+ const tokenAddress2 = WETHToken.target; // Ether
+ const amount2 = ethers.parseEther("10");
+ await WETHToken.connect(bridgeMock).mint(deployer.address, amount2, {gasPrice: 0});
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount2,
+ tokenAddress2,
+ false,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ 0, // weth bridge
+ ethers.ZeroAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount2,
+ "0x",
+ 2
+ )
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(deployer.address, ethers.ZeroAddress, amount2);
+ });
+
+ it("should claim Gas tokens from SovereignChain to SovereignChain", async () => {
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = acc1.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+ const indexRollup = 5;
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ if (i == indexRollup) {
+ merkleTreeRollup.add(rootLocalRollup);
+ } else {
+ merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32));
+ }
+ }
+ const rootRollup = merkleTreeRollup.getRoot();
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRootContract.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRootContract,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const sovereignChainExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(sovereignChainExitRootSC).to.be.equal(rootRollup);
+ const mainnetExitRootSC = ethers.ZeroHash;
+ expect(mainnetExitRootSC).to.be.equal(mainnetExitRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rootRollup);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof rollup
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ /*
+ * claim
+ * Can't claim without native (ether)
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ rootLocalRollup,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.reverted;
+
+ await setBalance(sovereignChainBridgeContract.target as any, amount);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ const initialBalance = await ethers.provider.getBalance(sovereignChainBridgeContract.target);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ {
+ gasPrice: 0,
+ }
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ sovereignChainExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ expect(initialBalance - amount).to.be.equal(
+ await ethers.provider.getBalance(sovereignChainBridgeContract.target)
+ );
+ });
+
+ it("should claim tokens from SovereignChain to SovereignChain2", async () => {
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ merkleTreeRollup.add(rootLocalRollup);
+ }
+
+ const rootRollup = merkleTreeRollup.getRoot();
+
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRootContract.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRootContract,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rootRollup);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof local
+ const indexRollup = 5;
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)
+ ).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ // claim
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ // create2 parameters
+ const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]);
+ const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
+ const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]);
+ const precalculateWrappedErc20 = await ethers.getCreate2Address(
+ sovereignChainBridgeContract.target as string,
+ salt,
+ hashInitCode
+ );
+ const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped;
+
+ // Use precalculatedWrapperAddress and check if matches
+ expect(
+ await sovereignChainBridgeContract.precalculatedWrapperAddress(
+ networkIDRollup,
+ tokenAddress,
+ tokenName,
+ tokenSymbol,
+ decimals
+ )
+ ).to.be.equal(precalculateWrappedErc20);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(sovereignChainBridgeContract, "NewWrappedToken")
+ .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ const newTokenInfo = await sovereignChainBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20);
+
+ expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup);
+ expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress);
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+
+ expect(await sovereignChainBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20);
+
+ // Check the wrapper info
+ expect(await newWrappedToken.name()).to.be.equal(tokenName);
+ expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol);
+ expect(await newWrappedToken.decimals()).to.be.equal(decimals);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+
+ // Claim again the other leaf to mint tokens
+ const index2 = 1;
+ const proof2 = merkleTreeLocal.getProofTreeByIndex(index2);
+
+ expect(verifyMerkleProof(leafValue, proof2, index2, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rollupExitRootSC)).to.be.equal(true);
+
+ const globalIndex2 = computeGlobalIndex(index2, indexRollup, false);
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proof2,
+ proofRollup,
+ globalIndex2,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ // Burn Tokens
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const wrappedTokenAddress = newWrappedToken.target;
+ const newDestinationNetwork = networkIDRollup;
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(newWrappedToken.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(newWrappedToken, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ /*
+ * pre compute root merkle tree in Js
+ * const height = 32;
+ */
+ const merkleTreeMainnet = new MerkleTreeBridge(height);
+ // Imporant calcualte leaf with origin token address no wrapped token address
+ const originTokenAddress = tokenAddress;
+ const metadataMainnet = metadata; // since the token does not belong to this network
+ const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]);
+
+ const leafValueMainnet = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+ const leafValueMainnetSC = await sovereignChainBridgeContract.getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+
+ expect(leafValueMainnet).to.be.equal(leafValueMainnetSC);
+ merkleTreeMainnet.add(leafValueMainnet);
+ const rootJSMainnet = ethers.ZeroHash;
+
+ // Tokens are burnt
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n);
+ expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n);
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ wrappedTokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataMainnet,
+ depositCount
+ )
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(deployer.address, ethers.ZeroAddress, amount);
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(0);
+
+ // check merkle root with SC
+ const rootSCSovereignChain = await sovereignChainBridgeContract.getRoot();
+
+ // check merkle proof
+ const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0);
+ const indexMainnet = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCSovereignChain)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(
+ leafValueMainnet,
+ proofMainnet,
+ indexMainnet,
+ rootSCSovereignChain
+ )
+ ).to.be.equal(true);
+ });
+
+ it("should PolygonZkEVMBridge and sync the current root with events", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // gasToken
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ // create 3 new deposit
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount + 1n
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ gasTokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ gasTokenMetadata,
+ depositCount + 2n
+ );
+
+ // Prepare merkle tree
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+
+ // Get the deposit's events
+ const filter = sovereignChainBridgeContract.filters.BridgeEvent(
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined
+ );
+ const events = await sovereignChainBridgeContract.queryFilter(filter, 0, "latest");
+ events.forEach((e) => {
+ const {args} = e;
+ const leafValue = getLeafValue(
+ args.leafType,
+ args.originNetwork,
+ args.originAddress,
+ args.destinationNetwork,
+ args.destinationAddress,
+ args.amount,
+ ethers.solidityPackedKeccak256(["bytes"], [args.metadata])
+ );
+ merkleTree.add(leafValue);
+ });
+
+ // Check merkle root with SC
+ const rootSC = await sovereignChainBridgeContract.getRoot();
+ const rootJS = merkleTree.getRoot();
+
+ expect(rootSC).to.be.equal(rootJS);
+ });
+
+ it("should claim testing all the asserts", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ const globalIndex = computeGlobalIndex(index, index, false);
+ // Can't claim without tokens
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.reverted;
+
+ await setBalance(sovereignChainBridgeContract.target as any, amount);
+
+ // Check GlobalExitRoot invalid assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ mainnetExitRoot,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GlobalExitRootInvalid");
+
+ // Check Invalid smt proof assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex + 1n,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Check Already claimed_claim
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim ether", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ // claim weth
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, deployer.address, amount);
+
+ // Check balances after claim
+ expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await WETHToken.totalSupply()).to.be.equal(amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim message", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ /*
+ * claim
+ * Can't claim a message as an assets
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ const balanceDeployer = await ethers.provider.getBalance(deployer.address);
+
+ // Check mainnet destination assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(WETHToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, deployer.address, amount);
+
+ // Check balances after claim
+ expect(await WETHToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await WETHToken.totalSupply()).to.be.equal(amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+});
diff --git a/test/contractsv2/BridgeL2SovereignChain.test.ts b/test/contractsv2/BridgeL2SovereignChain.test.ts
new file mode 100644
index 000000000..79dfedd5d
--- /dev/null
+++ b/test/contractsv2/BridgeL2SovereignChain.test.ts
@@ -0,0 +1,2370 @@
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ ERC20PermitMock,
+ GlobalExitRootManagerL2SovereignChain,
+ BridgeL2SovereignChain,
+ TokenWrapped,
+ ERC20Decimals,
+} from "../../typechain-types";
+import {MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs";
+const MerkleTreeBridge = MTBridge;
+const {verifyMerkleProof, getLeafValue} = mtBridgeUtils;
+
+function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) {
+ return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]);
+}
+const _GLOBAL_INDEX_MAINNET_FLAG = 2n ** 64n;
+
+function computeGlobalIndex(indexLocal: any, indexRollup: any, isMainnet: Boolean) {
+ if (isMainnet === true) {
+ return BigInt(indexLocal) + _GLOBAL_INDEX_MAINNET_FLAG;
+ } else {
+ return BigInt(indexLocal) + BigInt(indexRollup) * 2n ** 32n;
+ }
+}
+
+describe("BridgeL2SovereignChain Contract", () => {
+ upgrades.silenceWarnings();
+
+ let sovereignChainBridgeContract: BridgeL2SovereignChain;
+ let polTokenContract: ERC20PermitMock;
+ let sovereignChainGlobalExitRootContract: GlobalExitRootManagerL2SovereignChain;
+
+ let deployer: any;
+ let rollupManager: any;
+ let bridgeManager: any;
+ let acc1: any;
+
+ const tokenName = "Matic Token";
+ const tokenSymbol = "MATIC";
+ const decimals = 18;
+ const tokenInitialBalance = ethers.parseEther("20000000");
+ const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [tokenName, tokenSymbol, decimals]
+ );
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+ const networkIDRollup2 = 2;
+
+ const LEAF_TYPE_ASSET = 0;
+ const LEAF_TYPE_MESSAGE = 1;
+
+ beforeEach("Deploy contracts", async () => {
+ // load signers
+ [deployer, rollupManager, acc1, bridgeManager] = await ethers.getSigners();
+ // Set trusted sequencer as coinbase for sovereign chains
+ await ethers.provider.send("hardhat_setCoinbase", [deployer.address]);
+ // deploy BridgeL2SovereignChain
+ const BridgeL2SovereignChainFactory = await ethers.getContractFactory("BridgeL2SovereignChain");
+ sovereignChainBridgeContract = (await upgrades.deployProxy(BridgeL2SovereignChainFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ })) as unknown as BridgeL2SovereignChain;
+
+ // deploy global exit root manager
+ const GlobalExitRootManagerL2SovereignChainFactory = await ethers.getContractFactory(
+ "GlobalExitRootManagerL2SovereignChain"
+ );
+ sovereignChainGlobalExitRootContract = (await upgrades.deployProxy(
+ GlobalExitRootManagerL2SovereignChainFactory,
+ [ethers.ZeroAddress, deployer.address], // Initializer params
+ {
+ initializer: "initialize", // initializer function name
+ constructorArgs: [sovereignChainBridgeContract.target], // Constructor arguments
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ }
+ )) as unknown as GlobalExitRootManagerL2SovereignChain;
+
+ // cannot initialize bridgeV2 initializer from Sovereign bridge
+ await expect(
+ sovereignChainBridgeContract.initialize(
+ networkIDMainnet,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ "0x"
+ )
+ ).to.revertedWithCustomError(sovereignChainBridgeContract, "InvalidInitializeFunction");
+
+ await sovereignChainBridgeContract.initialize(
+ networkIDRollup2,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ "0x",
+ ethers.Typed.address(bridgeManager),
+ ethers.ZeroAddress,
+ false
+ );
+
+ // deploy token
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ });
+
+ it("Should remap source 6 decimal token to 18 sovereign wrapped token and bridge", async () => {
+ const originNetwork = networkIDMainnet;
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = acc1.address;
+ const sixDecimal = 6;
+ const eighteenDecimal = 18;
+ const amountSIXBridged = 1;
+ // Deploy 6 decimals token
+ const sixDecimalsTokenFactory = await ethers.getContractFactory("ERC20Decimals");
+ const sixDecimalsTokenContract = await sixDecimalsTokenFactory.deploy(
+ "6DEC",
+ "SIX",
+ deployer.address,
+ ethers.parseUnits("10", sixDecimal), // 10 SIX
+ sixDecimal
+ );
+ const sovereignTokenContract = await sixDecimalsTokenFactory.deploy(
+ "18DEC",
+ "EIGHTEEN",
+ deployer.address,
+ ethers.parseUnits("20", eighteenDecimal), // 20 EIGHTEEN
+ eighteenDecimal
+ );
+ // Remap token
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress(
+ [networkIDMainnet],
+ [sixDecimalsTokenContract.target],
+ [sovereignTokenContract.target],
+ [false]
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDMainnet, sixDecimalsTokenContract.target, sovereignTokenContract.target, false);
+
+ // Add allowance
+ await sixDecimalsTokenContract.approve(
+ sovereignChainBridgeContract.target,
+ ethers.parseUnits("10", sixDecimal)
+ );
+
+ // bridge asset
+ await sovereignChainBridgeContract.bridgeAsset(
+ originNetwork,
+ destinationAddress,
+ ethers.parseUnits(String(amountSIXBridged), sixDecimal), // 1 SIX
+ sixDecimalsTokenContract.target,
+ true,
+ "0x"
+ );
+
+ // Check burnt balance is 1 SIX
+ const balanceOfSIX = await sixDecimalsTokenContract.balanceOf(deployer.address);
+ const balanceOfEIGHTEEN = await sovereignTokenContract.balanceOf(deployer.address);
+ expect(balanceOfSIX).to.be.equal(ethers.parseUnits(String(10 - amountSIXBridged), 6));
+ const metadata = "0x"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // Claim Asset
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ sixDecimalsTokenContract.target,
+ destinationNetwork,
+ destinationAddress,
+ ethers.parseUnits(String(amountSIXBridged), sixDecimal), // 1 SIX
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ sixDecimalsTokenContract.target,
+ destinationNetwork,
+ destinationAddress,
+ ethers.parseUnits(String(amountSIXBridged), sixDecimal), // 1 SIX
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(
+ index,
+ originNetwork,
+ sixDecimalsTokenContract.target,
+ destinationAddress,
+ ethers.parseUnits(String(amountSIXBridged), sixDecimal)
+ );
+ // Check balance is with 6 decimals and check is from sovereign token
+ const sovereignTokenAmount = await sovereignTokenContract.balanceOf(destinationAddress);
+ const sixDecimalsTokenAmount = await sixDecimalsTokenContract.balanceOf(destinationAddress);
+ expect(String(sovereignTokenAmount)).to.be.equal(ethers.parseUnits(String(amountSIXBridged), sixDecimal));
+ });
+
+ it("should check the initialize function", async () => {
+ // deploy PolygonZkEVMBridge
+ const sovereignChainBridgeContract = await ethers.getContractFactory("BridgeL2SovereignChain");
+ const bridge = await upgrades.deployProxy(sovereignChainBridgeContract, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ });
+
+ // Gas token network should be zero if gas token address is zero
+ await expect(
+ bridge.initialize(
+ networkIDRollup2,
+ ethers.ZeroAddress, // zero for ether
+ 1, // not zero, revert
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ ethers.ZeroAddress,
+ false
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GasTokenNetworkMustBeZeroOnEther");
+
+ // _sovereignWETHAddress should be zero and _sovereignWETHAddressIsNotMintable should be false for native wethGasTokenNetworks
+ await expect(
+ bridge.initialize(
+ networkIDRollup2,
+ ethers.ZeroAddress, // zero for ether
+ 0, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ bridge.target, // Not zero, revert
+ false
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSovereignWETHAddressParams");
+
+ await expect(
+ bridge.initialize(
+ networkIDRollup2,
+ ethers.ZeroAddress, // zero for ether
+ 0, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ metadataToken,
+ ethers.Typed.address(bridgeManager.address),
+ ethers.ZeroAddress,
+ true // Not false, revert,
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSovereignWETHAddressParams");
+ });
+
+ it("Migrate non mintable tokens", async () => {
+ // Deploy token1
+ const tokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ const iBalance = ethers.parseEther("20000000");
+ const migrationAmount = ethers.parseEther("10");
+ const networkIDRollup1 = 1;
+ const legacyToken = await tokenFactory.deploy(tokenName, tokenSymbol, deployer.address, iBalance);
+ // Send legacy tokens to user
+ await legacyToken.transfer(acc1.address, migrationAmount);
+ expect(await legacyToken.balanceOf(acc1.address)).to.be.equal(migrationAmount);
+ // Approve token transfer to bridge
+ await legacyToken.connect(acc1).approve(sovereignChainBridgeContract.target, migrationAmount);
+
+ // Try migrate token that is not mapped
+ await expect(
+ sovereignChainBridgeContract.connect(acc1).migrateLegacyToken(legacyToken.target, migrationAmount)
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "TokenNotMapped");
+
+ // Make first remapping
+ await sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress(
+ [networkIDRollup1],
+ [polTokenContract.target],
+ [legacyToken.target],
+ [true]
+ );
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress(
+ [networkIDRollup1],
+ [polTokenContract.target],
+ [legacyToken.target],
+ [true]
+ )
+ ).to.revertedWithCustomError(sovereignChainBridgeContract, "TokenAlreadyMapped");
+ // Deploy token 2
+ const updatedToken = await tokenFactory.deploy(tokenName, tokenSymbol, deployer.address, iBalance);
+ // Send legacy tokens to bridge
+ await updatedToken.transfer(sovereignChainBridgeContract.target, migrationAmount);
+ expect(await updatedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(migrationAmount);
+ // Make second remapping
+ await sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress(
+ [networkIDRollup1],
+ [polTokenContract.target],
+ [updatedToken.target],
+ [true]
+ );
+
+ // Try migrate a token already updated
+ await expect(
+ sovereignChainBridgeContract.connect(acc1).migrateLegacyToken(updatedToken.target, migrationAmount)
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "TokenAlreadyUpdated");
+
+ // Migrate tokens
+ await sovereignChainBridgeContract.connect(acc1).migrateLegacyToken(legacyToken.target, migrationAmount);
+ expect(await legacyToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(migrationAmount);
+ expect(await legacyToken.balanceOf(acc1.address)).to.be.equal(0n);
+ expect(await updatedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(0n);
+ expect(await updatedToken.balanceOf(acc1.address)).to.be.equal(migrationAmount);
+ });
+
+ it("should Sovereign Chain bridge a remapped asset not mintable and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // deploy sovereign
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ const sovereignToken = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const sovereignToken2 = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const sovereignToken3 = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const sovereignToken4 = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const tokenAddress2 = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ const balanceDeployer = await sovereignToken.balanceOf(deployer.address);
+ const balanceBridge = await sovereignToken.balanceOf(sovereignChainBridgeContract.target);
+ // Remap asset
+ // Remap not mintable token
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress([networkIDRollup], [tokenAddress], [sovereignToken.target], [true])
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDRollup, tokenAddress, sovereignToken.target, true);
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ // Check insufficient allowance
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ sovereignToken.target,
+ true,
+ "0x"
+ )
+ ).to.be.revertedWith("ERC20: insufficient allowance");
+ // create a new deposit
+ await expect(sovereignToken.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(sovereignToken, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ sovereignToken.target,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ networkIDRollup,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+ // Check updated exit root
+ expect(await sovereignChainGlobalExitRootContract.lastRollupExitRoot()).to.be.equal(rootJSMainnet);
+ expect(await sovereignToken.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await sovereignToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(balanceBridge + amount);
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+
+ // Try to insert global exit root with non coinbase
+ await expect(
+ sovereignChainGlobalExitRootContract.connect(acc1).insertGlobalExitRoot(computedGlobalExitRoot)
+ ).to.be.revertedWithCustomError(sovereignChainGlobalExitRootContract, "OnlyGlobalExitRootUpdater");
+
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.be.eq(1);
+
+ expect(await sovereignChainGlobalExitRootContract.insertedGERCount()).to.be.eq(1);
+
+ // Trigger NotEnoughGlobalExitRootsInserted
+ await expect(
+ sovereignChainGlobalExitRootContract.removeLastGlobalExitRoots([
+ computedGlobalExitRoot,
+ computedGlobalExitRoot,
+ ])
+ ).to.revertedWithCustomError(sovereignChainGlobalExitRootContract, "NotEnoughGlobalExitRootsInserted");
+
+ // Trigger NotLastInsertedGlobalExitRoot
+ await expect(
+ sovereignChainGlobalExitRootContract.removeLastGlobalExitRoots([metadataHash])
+ ).to.revertedWithCustomError(sovereignChainGlobalExitRootContract, "NotLastInsertedGlobalExitRoot");
+
+ // Trigger OnlyGlobalExitRootRemover
+ await expect(
+ sovereignChainGlobalExitRootContract.connect(rollupManager).removeLastGlobalExitRoots([metadataHash])
+ ).to.revertedWithCustomError(sovereignChainGlobalExitRootContract, "OnlyGlobalExitRootRemover");
+
+ // Update globalExitRootRemover
+ await sovereignChainGlobalExitRootContract.setGlobalExitRootRemover(deployer.address);
+ // Update globalExitRootUpdater
+ await sovereignChainGlobalExitRootContract.setGlobalExitRootUpdater(deployer.address);
+
+ // Remove global exit root
+ expect(await sovereignChainGlobalExitRootContract.removeLastGlobalExitRoots([computedGlobalExitRoot]))
+ .to.emit(sovereignChainGlobalExitRootContract, "RemoveGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Test to remove more than one global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+ const computedGlobalExitRoot2 = "0x5946741ff5ff7732e1c7614ae327543a1d9f5870fcb8afbf146bd5ea75d6d519"; // Random 32 bytes
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot2))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot2);
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot2)).to.be.eq(2);
+
+ expect(
+ await sovereignChainGlobalExitRootContract.removeLastGlobalExitRoots([
+ computedGlobalExitRoot2,
+ computedGlobalExitRoot,
+ ])
+ )
+ .to.emit(sovereignChainGlobalExitRootContract, "RemoveGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.be.eq(0);
+
+ expect(await sovereignChainGlobalExitRootContract.insertedGERCount()).to.be.eq(0);
+
+ // Insert global exit root again
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // Remove unmapped sovereign token address, should revert
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).removeLegacySovereignTokenAddress(tokenAddress)
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "TokenNotRemapped");
+ // Remove not updated sovereign token address, should revert
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).removeLegacySovereignTokenAddress(sovereignToken.target)
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "TokenNotRemapped");
+
+ // Remove updated sovereign token address
+ // Remap token a second time to support removal function
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress([networkIDRollup], [tokenAddress], [sovereignToken2.target], [true])
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDRollup, tokenAddress, sovereignToken2.target, true);
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).removeLegacySovereignTokenAddress(sovereignToken.target)
+ )
+ .to.emit(sovereignChainBridgeContract, "RemoveLegacySovereignTokenAddress")
+ .withArgs(sovereignToken.target);
+ // Remap sovereign address with multiCall
+ const originNetworksArray = [networkIDRollup, networkIDRollup];
+ const originTokenAddressesArray = [tokenAddress, tokenAddress2.target];
+ const sovereignTokenAddressesArray = [sovereignToken3.target, sovereignToken4.target];
+ const isNotMintableArray = [true, false];
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .setMultipleSovereignTokenAddress(
+ originNetworksArray,
+ originTokenAddressesArray,
+ sovereignTokenAddressesArray,
+ isNotMintableArray
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDRollup, tokenAddress, sovereignToken3.target, true)
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDRollup, tokenAddress2.target, sovereignToken4.target, false);
+
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).setMultipleSovereignTokenAddress(
+ originNetworksArray,
+ [], // Different length
+ sovereignTokenAddressesArray,
+ isNotMintableArray
+ )
+ ).to.revertedWithCustomError(sovereignChainBridgeContract, "InputArraysLengthMismatch");
+ });
+
+ it("should Sovereign Chain bridge a remapped asset mintable and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // deploy sovereign
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ const sovereignToken = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+
+ // Remap asset
+ // Trigger requires
+ // only bridge manager
+ await expect(
+ sovereignChainBridgeContract
+ .connect(rollupManager)
+ .setMultipleSovereignTokenAddress([networkIDMainnet], [tokenAddress], [sovereignToken.target], [false])
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "OnlyBridgeManager");
+ // Set rollupManager as bridge manager
+ await expect(sovereignChainBridgeContract.connect(bridgeManager).setBridgeManager(rollupManager.address))
+ .to.emit(sovereignChainBridgeContract, "SetBridgeManager")
+ .withArgs(rollupManager.address);
+
+ // invalid token address
+ await expect(
+ sovereignChainBridgeContract
+ .connect(rollupManager)
+ .setMultipleSovereignTokenAddress(
+ [networkIDMainnet],
+ [ethers.ZeroAddress],
+ [sovereignToken.target],
+ [false]
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidZeroAddress");
+ // Invalid origin network
+ await expect(
+ sovereignChainBridgeContract
+ .connect(rollupManager)
+ .setMultipleSovereignTokenAddress([networkIDRollup2], [tokenAddress], [sovereignToken.target], [false])
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "OriginNetworkInvalid");
+ await expect(
+ sovereignChainBridgeContract
+ .connect(rollupManager)
+ .setMultipleSovereignTokenAddress([networkIDRollup], [tokenAddress], [sovereignToken.target], [false])
+ )
+ .to.emit(sovereignChainBridgeContract, "SetSovereignTokenAddress")
+ .withArgs(networkIDRollup, tokenAddress, sovereignToken.target, false);
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+ // Check updated exit root
+ expect(await sovereignChainGlobalExitRootContract.lastRollupExitRoot()).to.be.equal(rootJSMainnet);
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ });
+
+ it("should check the initialize parameters", async () => {
+ expect(await sovereignChainBridgeContract.globalExitRootManager()).to.be.equal(
+ sovereignChainGlobalExitRootContract.target
+ );
+ expect(await sovereignChainBridgeContract.networkID()).to.be.equal(networkIDRollup2);
+ expect(await sovereignChainBridgeContract.polygonRollupManager()).to.be.equal(rollupManager.address);
+
+ // cannot initialize again
+ await expect(
+ sovereignChainBridgeContract.initialize(
+ networkIDMainnet,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ "0x",
+ ethers.Typed.address(bridgeManager),
+ ethers.ZeroAddress,
+ false
+ )
+ ).to.be.revertedWith("Initializable: contract is already initialized");
+
+ await expect(
+ sovereignChainGlobalExitRootContract.initialize(ethers.ZeroAddress, ethers.ZeroAddress)
+ ).to.be.revertedWith("Initializable: contract is already initialized");
+ });
+
+ it("should check bridgeMessageWETH reverts", async () => {
+ await expect(
+ sovereignChainBridgeContract.bridgeMessageWETH(networkIDMainnet, deployer.address, 0, true, "0x")
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NativeTokenIsEther");
+
+ await expect(
+ sovereignChainBridgeContract.connect(bridgeManager).setSovereignWETHAddress(deployer.address, true)
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "WETHRemappingNotSupportedOnGasTokenNetworks");
+ });
+
+ it("should Sovereign Chain bridge asset and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: 1}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "MsgValueNotZero");
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+ // Check updated exit root
+ expect(await sovereignChainGlobalExitRootContract.lastRollupExitRoot()).to.be.equal(rootJSMainnet);
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ });
+
+ it("should message at Sovereign chain and verify merkle proof", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const originAddress = deployer.address;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(networkIDRollup2, destinationAddress, true, "0x")
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "DestinationNetworkInvalid");
+
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {
+ value: amount,
+ })
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)
+ ).to.be.equal(true);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ });
+
+ it("should bridge asset and message to sovereign chain to check global exit root updates", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(polTokenContract.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ false,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(
+ balanceBridge + amount
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(0);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // Update global exit root
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // bridge message
+ await expect(
+ sovereignChainBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, false, metadata, {
+ value: amount,
+ })
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ deployer.address,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ 1
+ );
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(1);
+
+ // Update global exit root
+ await sovereignChainBridgeContract.updateGlobalExitRoot();
+
+ expect(await sovereignChainBridgeContract.lastUpdatedDepositCount()).to.be.equal(2);
+ expect(await sovereignChainGlobalExitRootContract.lastRollupExitRoot()).to.not.be.equal(rootJSMainnet);
+
+ // Just to have the metric of a low cost bridge Asset
+ const tokenAddress2 = ethers.ZeroAddress; // Ether
+ const amount2 = ethers.parseEther("10");
+ await sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount2,
+ tokenAddress2,
+ false,
+ "0x",
+ {value: amount2}
+ );
+ });
+
+ it("should claim tokens from Mainnet to Mainnet", async () => {
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = acc1.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+ const indexRollup = 5;
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ if (i == indexRollup) {
+ merkleTreeRollup.add(rootLocalRollup);
+ } else {
+ merkleTreeRollup.add(ethers.toBeHex(ethers.toQuantity(ethers.randomBytes(32)), 32));
+ }
+ }
+
+ const rootRollup = merkleTreeRollup.getRoot();
+
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRootContract.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRootContract,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rootRollup);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // check merkle proof
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof rollup
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)
+ ).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+ /*
+ * claim
+ * Can't claim without tokens
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ Number(globalIndex),
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWith("ERC20: transfer amount exceeds balance");
+
+ // transfer tokens, then claim
+ await expect(polTokenContract.transfer(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Transfer")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(polTokenContract, "Transfer")
+ .withArgs(sovereignChainBridgeContract.target, acc1.address, amount);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim tokens from Rollup to Mainnet", async () => {
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ merkleTreeRollup.add(rootLocalRollup);
+ }
+
+ const rootRollup = merkleTreeRollup.getRoot();
+
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRootContract.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRootContract,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rootRollup);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ // check merkle proof
+
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof local
+ const indexRollup = 5;
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)
+ ).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ // claim
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ // create2 parameters
+ const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]);
+ const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
+ const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]);
+ const precalculateWrappedErc20 = await ethers.getCreate2Address(
+ sovereignChainBridgeContract.target as string,
+ salt,
+ hashInitCode
+ );
+ const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped;
+
+ // Use precalculatedWrapperAddress and check if matches
+ expect(
+ await sovereignChainBridgeContract.precalculatedWrapperAddress(
+ networkIDRollup,
+ tokenAddress,
+ tokenName,
+ tokenSymbol,
+ decimals
+ )
+ ).to.be.equal(precalculateWrappedErc20);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(sovereignChainBridgeContract, "NewWrappedToken")
+ .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ const newTokenInfo = await sovereignChainBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20);
+
+ // Use precalculatedWrapperAddress and check if matches
+ expect(
+ await sovereignChainBridgeContract.calculateTokenWrapperAddress(
+ networkIDRollup,
+ tokenAddress,
+ precalculateWrappedErc20
+ )
+ ).to.be.equal(precalculateWrappedErc20);
+
+ expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup);
+ expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress);
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+ expect(await sovereignChainBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
+ precalculateWrappedErc20
+ );
+
+ expect(await sovereignChainBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20);
+
+ // Check the wrapper info
+ expect(await newWrappedToken.name()).to.be.equal(tokenName);
+ expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol);
+ expect(await newWrappedToken.decimals()).to.be.equal(decimals);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+
+ // Claim again the other leaf to mint tokens
+ const index2 = 1;
+ const proof2 = merkleTreeLocal.getProofTreeByIndex(index2);
+
+ expect(verifyMerkleProof(leafValue, proof2, index2, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rollupExitRootSC)).to.be.equal(true);
+
+ const globalIndex2 = computeGlobalIndex(index2, indexRollup, false);
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proof2,
+ proofRollup,
+ globalIndex2,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(globalIndex2, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(ethers.ZeroAddress, destinationAddress, amount);
+
+ // Burn Tokens
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const wrappedTokenAddress = newWrappedToken.target;
+ const newDestinationNetwork = networkIDRollup;
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // create a new deposit
+ await expect(newWrappedToken.approve(sovereignChainBridgeContract.target, amount))
+ .to.emit(newWrappedToken, "Approval")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ /*
+ * pre compute root merkle tree in Js
+ * const height = 32;
+ */
+ const merkleTreeMainnet = new MerkleTreeBridge(height);
+ // Imporant calcualte leaf with origin token address no wrapped token address
+ const originTokenAddress = tokenAddress;
+ const metadataMainnet = metadata; // since the token does not belong to this network
+ const metadataHashMainnet = ethers.solidityPackedKeccak256(["bytes"], [metadataMainnet]);
+
+ const leafValueMainnet = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+ const leafValueMainnetSC = await sovereignChainBridgeContract.getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHashMainnet
+ );
+
+ expect(leafValueMainnet).to.be.equal(leafValueMainnetSC);
+ merkleTreeMainnet.add(leafValueMainnet);
+ const rootJSMainnet = merkleTreeMainnet.getRoot();
+
+ // Tokens are burnt
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount * 2n);
+ expect(await newWrappedToken.balanceOf(destinationAddress)).to.be.equal(amount * 2n);
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ wrappedTokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originTokenAddress,
+ newDestinationNetwork,
+ destinationAddress,
+ amount,
+ metadataMainnet,
+ depositCount
+ )
+ .to.emit(newWrappedToken, "Transfer")
+ .withArgs(deployer.address, ethers.ZeroAddress, amount);
+
+ expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(deployer.address)).to.be.equal(amount);
+ expect(await newWrappedToken.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(0);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proofMainnet = merkleTreeMainnet.getProofTreeByIndex(0);
+ const indexMainnet = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValueMainnet, proofMainnet, indexMainnet, rootSCMainnet)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(
+ leafValueMainnet,
+ proofMainnet,
+ indexMainnet,
+ rootSCMainnet
+ )
+ ).to.be.equal(true);
+
+ const computedGlobalExitRoot2 = calculateGlobalExitRoot(rootJSMainnet, rollupExitRoot);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot2))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot2)).to.not.be.eq(0);
+
+ // Insert an already inserted GER
+ await expect(
+ sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot2)
+ ).to.be.revertedWithCustomError(sovereignChainGlobalExitRootContract, "GlobalExitRootAlreadySet");
+
+ // Unset claims in bulk
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+ expect(true).to.be.equal(await sovereignChainBridgeContract.isClaimed(index2, indexRollup + 1));
+
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .unsetMultipleClaimedBitmap([indexLocal, index2], [indexRollup + 1])
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InputArraysLengthMismatch");
+
+ await sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .unsetMultipleClaimedBitmap([indexLocal, index2], [indexRollup + 1, indexRollup + 1]);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(index2, indexRollup + 1));
+
+ // Try to unset again
+ await expect(
+ sovereignChainBridgeContract
+ .connect(bridgeManager)
+ .unsetMultipleClaimedBitmap([indexLocal, index2], [indexRollup + 1, indexRollup + 1])
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "ClaimNotSet");
+ });
+
+ it("should claim tokens from Rollup to Mainnet, failing deploy wrapped", async () => {
+ const originNetwork = networkIDRollup;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = ethers.hexlify(ethers.randomBytes(40));
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTreeLocal = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTreeLocal.add(leafValue);
+ merkleTreeLocal.add(leafValue);
+
+ const rootLocalRollup = merkleTreeLocal.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ for (let i = 0; i < 10; i++) {
+ merkleTreeRollup.add(rootLocalRollup);
+ }
+
+ const rootRollup = merkleTreeRollup.getRoot();
+
+ // check only rollup account with update rollup exit root
+ await expect(sovereignChainGlobalExitRootContract.updateExitRoot(rootRollup)).to.be.revertedWithCustomError(
+ sovereignChainGlobalExitRootContract,
+ "OnlyAllowedContracts"
+ );
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rootRollup, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rootRollup);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ // check merkle proof
+ // Merkle proof local
+ const indexLocal = 0;
+ const proofLocal = merkleTreeLocal.getProofTreeByIndex(indexLocal);
+
+ // Merkle proof local
+ const indexRollup = 5;
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(indexRollup);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, indexLocal, rootLocalRollup)).to.be.equal(true);
+ expect(verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(rootLocalRollup, proofRollup, indexRollup, rootRollup)
+ ).to.be.equal(true);
+ const globalIndex = computeGlobalIndex(indexLocal, indexRollup, false);
+
+ expect(false).to.be.equal(await sovereignChainBridgeContract.isClaimed(indexLocal, indexRollup + 1));
+
+ // claim
+ const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
+ // create2 parameters
+ const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]);
+ const minimalBytecodeProxy = await sovereignChainBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
+ const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]);
+ const precalculateWrappedErc20 = await ethers.getCreate2Address(
+ sovereignChainBridgeContract.target as string,
+ salt,
+ hashInitCode
+ );
+
+ // Use precalculatedWrapperAddress and check if matches
+ expect(
+ await sovereignChainBridgeContract.precalculatedWrapperAddress(
+ networkIDRollup,
+ tokenAddress,
+ tokenName,
+ tokenSymbol,
+ decimals
+ )
+ ).to.be.equal(precalculateWrappedErc20);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "FailedTokenWrappedDeployment");
+ });
+ it("should sovereignChainBridge and sync the current root with events", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // Ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x"; // since is ether does not have metadata
+
+ // create 3 new deposit
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount + 1n
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount + 2n
+ );
+
+ // Prepare merkle tree
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+
+ // Get the deposit's events
+ const filter = sovereignChainBridgeContract.filters.BridgeEvent(
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined
+ );
+ const events = await sovereignChainBridgeContract.queryFilter(filter, 0, "latest");
+ events.forEach((e) => {
+ const {args} = e;
+ const leafValue = getLeafValue(
+ args.leafType,
+ args.originNetwork,
+ args.originAddress,
+ args.destinationNetwork,
+ args.destinationAddress,
+ args.amount,
+ ethers.solidityPackedKeccak256(["bytes"], [args.metadata])
+ );
+ merkleTree.add(leafValue);
+ });
+
+ // Check merkle root with SC
+ const rootSC = await sovereignChainBridgeContract.getRoot();
+ const rootJS = merkleTree.getRoot();
+
+ expect(rootSC).to.be.equal(rootJS);
+ });
+
+ it("should claim testing all the asserts", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDRollup2;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+
+ // Try claim with 10 rollup leafs
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ const globalIndex = computeGlobalIndex(index, index, false);
+ // Can't claim without tokens
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWith("ERC20: transfer amount exceeds balance");
+
+ // transfer tokens, then claim
+ await expect(polTokenContract.transfer(sovereignChainBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Transfer")
+ .withArgs(deployer.address, sovereignChainBridgeContract.target, amount);
+
+ // Check GlobalExitRoot invalid assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ mainnetExitRoot,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "GlobalExitRootInvalid");
+
+ // Check Invalid smt proof assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex + 1n,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount)
+ .to.emit(polTokenContract, "Transfer")
+ .withArgs(sovereignChainBridgeContract.target, deployer.address, amount);
+
+ // Check Already claimed_claim
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim ether", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ /*
+ * claim
+ * Can't claim without ether
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "EtherTransferFailed");
+
+ const balanceDeployer = await ethers.provider.getBalance(deployer.address);
+ // Check mainnet destination assert
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ networkIDRollup2,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "DestinationNetworkInvalid");
+
+ // This is used just to pay ether to the SovereignChain smart contract and be able to claim it afterwards.
+ expect(
+ await sovereignChainBridgeContract.bridgeAsset(
+ networkIDRollup,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ );
+
+ // Check balances before claim
+ expect(await ethers.provider.getBalance(sovereignChainBridgeContract.target)).to.be.equal(amount);
+ expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - amount);
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Check balances after claim
+ expect(await ethers.provider.getBalance(sovereignChainBridgeContract.target)).to.be.equal(
+ ethers.parseEther("0")
+ );
+ expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should claim message", async () => {
+ // Add a claim leaf to rollup exit tree
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = ethers.ZeroAddress; // ether
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup2;
+ const destinationAddress = deployer.address;
+
+ const metadata = "0x176923791298713271763697869132"; // since is ether does not have metadata
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const mainnetExitRoot = ethers.ZeroHash;
+
+ // compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+
+ // check merkle root with SC
+ const rootJSRollup = merkleTree.getRoot();
+ const merkleTreeRollup = new MerkleTreeBridge(height);
+ merkleTreeRollup.add(rootJSRollup);
+ const rollupRoot = merkleTreeRollup.getRoot();
+
+ // add rollup Merkle root
+ await ethers.provider.send("hardhat_impersonateAccount", [sovereignChainBridgeContract.target]);
+ const bridgeMock = await ethers.getSigner(sovereignChainBridgeContract.target as any);
+ await sovereignChainGlobalExitRootContract.connect(bridgeMock).updateExitRoot(rollupRoot, {gasPrice: 0});
+
+ // check roots
+ const rollupExitRootSC = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+ expect(rollupExitRootSC).to.be.equal(rollupRoot);
+
+ const computedGlobalExitRoot = calculateGlobalExitRoot(mainnetExitRoot, rollupExitRootSC);
+ // Insert global exit root
+ expect(await sovereignChainGlobalExitRootContract.insertGlobalExitRoot(computedGlobalExitRoot))
+ .to.emit(sovereignChainGlobalExitRootContract, "InsertGlobalExitRoot")
+ .withArgs(computedGlobalExitRoot);
+
+ // Check GER has value in mapping
+ expect(await sovereignChainGlobalExitRootContract.globalExitRootMap(computedGlobalExitRoot)).to.not.be.eq(0);
+ // check merkle proof
+ const index = 0;
+ const proofLocal = merkleTree.getProofTreeByIndex(0);
+ const proofRollup = merkleTreeRollup.getProofTreeByIndex(0);
+ const globalIndex = computeGlobalIndex(index, index, false);
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)).to.be.equal(true);
+ expect(
+ await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proofLocal, index, rootJSRollup)
+ ).to.be.equal(true);
+
+ /*
+ * claim
+ * Can't claim a message as an assets
+ */
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ /*
+ * claim
+ * Can't claim invalid destination network
+ */
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ networkIDRollup,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "DestinationNetworkInvalid");
+
+ /*
+ * claim
+ * Can't claim without ether
+ */
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "MessageFailed");
+
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ networkIDRollup,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "DestinationNetworkInvalid");
+
+ const balanceDeployer = await ethers.provider.getBalance(deployer.address);
+ /*
+ * Create a deposit to add ether to the SovereignChainBridge
+ * Check deposit amount ether asserts
+ */
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ networkIDRollup,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: ethers.parseEther("100")}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AmountDoesNotMatchMsgValue");
+
+ // Check mainnet destination assert
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ networkIDRollup2,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "DestinationNetworkInvalid");
+
+ // This is used just to pay ether to the SovereignChainBridge smart contract and be able to claim it afterwards.
+ expect(
+ await sovereignChainBridgeContract.bridgeAsset(
+ networkIDRollup,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {value: amount}
+ )
+ );
+
+ // Check balances before claim
+ expect(await ethers.provider.getBalance(sovereignChainBridgeContract.target)).to.be.equal(amount);
+ expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer - amount);
+
+ // Check mainnet destination assert
+ await expect(
+ sovereignChainBridgeContract.claimAsset(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "InvalidSmtProof");
+
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "ClaimEvent")
+ .withArgs(index, originNetwork, tokenAddress, destinationAddress, amount);
+
+ // Check balances after claim
+ expect(await ethers.provider.getBalance(sovereignChainBridgeContract.target)).to.be.equal(
+ ethers.parseEther("0")
+ );
+ expect(await ethers.provider.getBalance(deployer.address)).to.be.lte(balanceDeployer);
+
+ // Can't claim because nullifier
+ await expect(
+ sovereignChainBridgeContract.claimMessage(
+ proofLocal,
+ proofRollup,
+ globalIndex,
+ mainnetExitRoot,
+ rollupExitRootSC,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "AlreadyClaimed");
+ });
+
+ it("should test emergency state", async () => {
+ await expect(sovereignChainBridgeContract.activateEmergencyState()).to.be.revertedWithCustomError(
+ sovereignChainBridgeContract,
+ "EmergencyStateNotAllowed"
+ );
+
+ await expect(sovereignChainBridgeContract.deactivateEmergencyState()).to.be.revertedWithCustomError(
+ sovereignChainBridgeContract,
+ "EmergencyStateNotAllowed"
+ );
+ });
+});
diff --git a/test/contractsv2/BridgeV2MetadataSovereignChains.test.ts b/test/contractsv2/BridgeV2MetadataSovereignChains.test.ts
new file mode 100644
index 000000000..86a30b725
--- /dev/null
+++ b/test/contractsv2/BridgeV2MetadataSovereignChains.test.ts
@@ -0,0 +1,787 @@
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ ERC20PermitMock,
+ GlobalExitRootManagerL2SovereignChain,
+ BridgeL2SovereignChain,
+} from "../../typechain-types";
+import { MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs";
+const MerkleTreeBridge = MTBridge;
+const {verifyMerkleProof, getLeafValue} = mtBridgeUtils;
+const {
+ createPermitSignature,
+ ifacePermit,
+ createPermitSignatureDaiType,
+ ifacePermitDAI,
+ createPermitSignatureUniType,
+} = require("../../src/permit-helper");
+
+function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) {
+ return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]);
+}
+
+describe("SovereignBridge Contract", () => {
+ upgrades.silenceWarnings();
+
+ let sovereignChainBridgeContract: BridgeL2SovereignChain;
+ let polTokenContract: ERC20PermitMock;
+ let sovereignChainGlobalExitRootContract: GlobalExitRootManagerL2SovereignChain;
+
+ let deployer: any;
+ let rollupManager: any;
+ let acc1: any;
+
+ const tokenName = "Matic Token";
+ const tokenSymbol = "MATIC";
+ const decimals = 18;
+ const tokenInitialBalance = ethers.parseEther("20000000");
+ const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [tokenName, tokenSymbol, decimals]
+ );
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+
+ const LEAF_TYPE_ASSET = 0;
+
+
+ beforeEach("Deploy contracts", async () => {
+ // load signers
+ [deployer, rollupManager, acc1] = await ethers.getSigners();
+
+ // deploy PolygonZkEVMBridge
+ const BridgeL2SovereignChainFactory = await ethers.getContractFactory("BridgeL2SovereignChain");
+ sovereignChainBridgeContract = (await upgrades.deployProxy(BridgeL2SovereignChainFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ })) as unknown as BridgeL2SovereignChain;
+
+ // deploy global exit root manager
+ const GlobalExitRootManagerL2SovereignChainFactory = await ethers.getContractFactory("GlobalExitRootManagerL2SovereignChain");
+ sovereignChainGlobalExitRootContract = await GlobalExitRootManagerL2SovereignChainFactory.deploy(
+ sovereignChainBridgeContract.target
+ );
+
+ await sovereignChainBridgeContract.initialize(
+ networkIDMainnet,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ sovereignChainGlobalExitRootContract.target,
+ rollupManager.address,
+ "0x",
+ ethers.Typed.address(deployer.address),
+ ethers.ZeroAddress,
+ false,
+ );
+
+ // deploy token
+ const maticTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await maticTokenFactory.deploy(
+ tokenName,
+ tokenSymbol,
+ deployer.address,
+ tokenInitialBalance
+ );
+ });
+
+ it("should PolygonZkEVMBridge with weird token metadata", async () => {
+ const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata");
+
+ const nameWeird = "nameToken";
+ const symbolWeird = "NTK";
+
+ const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird);
+ const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird);
+ const decimalsWeird = 14;
+
+ const weirdTokenContract = await weirdErc20Metadata.deploy(
+ nameWeirdBytes32, // bytes32
+ symbolWeirdBytes, // bytes
+ decimalsWeird
+ );
+ await weirdTokenContract.waitForDeployment();
+
+ // mint and approve tokens
+ await weirdTokenContract.mint(deployer.address, tokenInitialBalance);
+ await weirdTokenContract.approve(sovereignChainBridgeContract.target, tokenInitialBalance);
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = weirdTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [nameWeird, symbolWeird, decimalsWeird]
+ );
+
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await sovereignChainBridgeContract.getRoot()).to.be.equal(rootJSMainnet);
+ });
+
+ it("should PolygonZkEVMBridge with weird token metadata with reverts", async () => {
+ const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata");
+
+ const nameWeird = "nameToken";
+ const symbolWeird = "NTK";
+
+ const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird);
+ const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird);
+ const decimalsWeird = ethers.MaxUint256;
+
+ const weirdTokenContract = await weirdErc20Metadata.deploy(
+ nameWeirdBytes32, // bytes32
+ symbolWeirdBytes, // bytes
+ decimalsWeird
+ );
+ await weirdTokenContract.waitForDeployment();
+
+ // mint and approve tokens
+ await weirdTokenContract.mint(deployer.address, tokenInitialBalance);
+ await weirdTokenContract.approve(sovereignChainBridgeContract.target, tokenInitialBalance);
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = weirdTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ // Since cannot decode decimals
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ ).to.be.reverted;
+
+ // toogle revert
+ await weirdTokenContract.toggleIsRevert();
+ // Use revert strings
+ const nameRevert = "NO_NAME";
+ const symbolRevert = "NO_SYMBOL";
+ const decimalsTooRevert = 18;
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [nameRevert, symbolRevert, decimalsTooRevert]
+ );
+
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await sovereignChainBridgeContract.getRoot()).to.be.equal(rootJSMainnet);
+ });
+
+ it("should PolygonZkEVMBridge with weird token metadata with empty data", async () => {
+ const weirdErc20Metadata = await ethers.getContractFactory("ERC20WeirdMetadata");
+
+ const nameWeird = "";
+ const symbolWeird = "";
+
+ const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird);
+ const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird);
+ const decimalsWeird = 255;
+
+ const weirdTokenContract = await weirdErc20Metadata.deploy(
+ nameWeirdBytes32, // bytes32
+ symbolWeirdBytes, // bytes
+ decimalsWeird
+ );
+ await weirdTokenContract.waitForDeployment();
+
+ // mint and approve tokens
+ await weirdTokenContract.mint(deployer.address, tokenInitialBalance);
+ await weirdTokenContract.approve(sovereignChainBridgeContract.target, tokenInitialBalance);
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = weirdTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ // Empty bytes32 is a not valid encoding
+ const nameEmpty = "NOT_VALID_ENCODING"; // bytes32 empty
+ const symbolEmpty = "";
+
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [nameEmpty, symbolEmpty, decimalsWeird]
+ );
+
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await sovereignChainBridgeContract.getRoot()).to.be.equal(rootJSMainnet);
+ });
+
+ it("should PolygonZkEVMBridge with weird token metadata with invalid data", async () => {
+ const weirdErc20Metadata = await ethers.getContractFactory("ERC20InvalidMetadata");
+
+ const nameWeird = "";
+ const symbolWeird = "";
+
+ const nameWeirdBytes32 = ethers.encodeBytes32String(nameWeird);
+ const symbolWeirdBytes = ethers.toUtf8Bytes(symbolWeird);
+ const decimalsWeird = 255;
+
+ const weirdTokenContract = (await weirdErc20Metadata.deploy(
+ nameWeirdBytes32, // bytes32
+ symbolWeirdBytes, // bytes
+ decimalsWeird
+ )) as any;
+ await weirdTokenContract.waitForDeployment();
+
+ // mint and approve tokens
+ await weirdTokenContract.mint(deployer.address, tokenInitialBalance);
+ await weirdTokenContract.approve(sovereignChainBridgeContract.target, tokenInitialBalance);
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = weirdTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ // Empty bytes32 is a not valid encoding
+ const nameEmpty = "NOT_VALID_ENCODING"; // bytes32 empty
+ const symbolEmpty = "NOT_VALID_ENCODING";
+
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [nameEmpty, symbolEmpty, decimalsWeird]
+ );
+
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+
+ expect(await sovereignChainBridgeContract.getRoot()).to.be.equal(rootJSMainnet);
+ });
+
+ it("should PolygonZkEVMBridge and with permit eip-2612 compilant", async () => {
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = polTokenContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await polTokenContract.balanceOf(deployer.address);
+ const balanceBridge = await polTokenContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ ).to.be.revertedWith("ERC20: insufficient allowance");
+
+ // user permit
+ const nonce = await polTokenContract.nonces(deployer.address);
+ const deadline = ethers.MaxUint256;
+ const {chainId} = await ethers.provider.getNetwork();
+
+ const {v, r, s} = await createPermitSignature(
+ polTokenContract,
+ deployer,
+ sovereignChainBridgeContract.target,
+ amount,
+ nonce,
+ deadline,
+ chainId
+ );
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ ifacePermit.encodeFunctionData("permit", [
+ deployer.address,
+ sovereignChainBridgeContract.target,
+ amount + 1n,
+ deadline,
+ v,
+ r,
+ s,
+ ])
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NotValidAmount");
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ ethers.ZeroHash
+ )
+ ).to.be.revertedWithCustomError(sovereignChainBridgeContract, "NotValidSignature");
+
+ const dataPermit = ifacePermit.encodeFunctionData("permit", [
+ deployer.address,
+ sovereignChainBridgeContract.target,
+ amount,
+ deadline,
+ v,
+ r,
+ s,
+ ]);
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ dataPermit
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ )
+
+ expect(await polTokenContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await polTokenContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(balanceBridge + amount);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(
+ true
+ );
+
+ });
+
+ it("should PolygonZkEVMBridge with permit DAI type contracts", async () => {
+ const {chainId} = await ethers.provider.getNetwork();
+ const daiTokenFactory = await ethers.getContractFactory("DaiMock");
+ const daiContract = (await daiTokenFactory.deploy(chainId)) as any;
+ await daiContract.waitForDeployment();
+ await daiContract.mint(deployer.address, ethers.parseEther("100"));
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = daiContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [await daiContract.name(), await daiContract.symbol(), await daiContract.decimals()]
+ );
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await daiContract.balanceOf(deployer.address);
+ const balanceBridge = await daiContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ ).to.be.revertedWith("Dai/insufficient-allowance");
+
+ // user permit
+ const nonce = await daiContract.nonces(deployer.address);
+ const deadline = ethers.MaxUint256;
+
+ const {v, r, s} = await createPermitSignatureDaiType(
+ daiContract,
+ deployer,
+ sovereignChainBridgeContract.target,
+ nonce,
+ deadline,
+ chainId
+ );
+
+ const dataPermit = ifacePermitDAI.encodeFunctionData("permit", [
+ deployer.address,
+ sovereignChainBridgeContract.target,
+ nonce,
+ deadline,
+ true,
+ v,
+ r,
+ s,
+ ]);
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ dataPermit
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ )
+
+ expect(await daiContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await daiContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(balanceBridge + amount);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(
+ true
+ );
+
+ });
+
+ it("should PolygonZkEVMBridge with permit UNI type contracts", async () => {
+ const uniTokenFactory = await ethers.getContractFactory("Uni");
+ const lastBlock = (await ethers.provider.getBlock("latest")) as any;
+ const uniContract = (await uniTokenFactory.deploy(
+ deployer.address,
+ deployer.address,
+ lastBlock.timestamp + 1
+ )) as any;
+ await uniContract.waitForDeployment();
+ await uniContract.mint(deployer.address, ethers.parseEther("100"));
+
+ const depositCount = await sovereignChainBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const tokenAddress = uniContract.target;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+
+ const metadata = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [await uniContract.name(), await uniContract.symbol(), await uniContract.decimals()]
+ );
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ const balanceDeployer = await uniContract.balanceOf(deployer.address);
+ const balanceBridge = await uniContract.balanceOf(sovereignChainBridgeContract.target);
+
+ const rollupExitRoot = await sovereignChainGlobalExitRootContract.lastRollupExitRoot();
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ const rootJSMainnet = merkleTree.getRoot();
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ "0x"
+ )
+ ).to.be.revertedWith("Uni::transferFrom: transfer amount exceeds spender allowance");
+
+ // user permit
+ const nonce = await uniContract.nonces(deployer.address);
+ const deadline = ethers.MaxUint256;
+ const {chainId} = await ethers.provider.getNetwork();
+
+ const {v, r, s} = await createPermitSignatureUniType(
+ uniContract,
+ deployer,
+ sovereignChainBridgeContract.target,
+ amount,
+ nonce,
+ deadline,
+ chainId
+ );
+
+ const dataPermit = ifacePermit.encodeFunctionData("permit", [
+ deployer.address,
+ sovereignChainBridgeContract.target,
+ amount,
+ deadline,
+ v,
+ r,
+ s,
+ ]);
+
+ await expect(
+ sovereignChainBridgeContract.bridgeAsset(
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ tokenAddress,
+ true,
+ dataPermit
+ )
+ )
+ .to.emit(sovereignChainBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ tokenAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ )
+
+ expect(await uniContract.balanceOf(deployer.address)).to.be.equal(balanceDeployer - amount);
+ expect(await uniContract.balanceOf(sovereignChainBridgeContract.target)).to.be.equal(balanceBridge + amount);
+
+ // check merkle root with SC
+ const rootSCMainnet = await sovereignChainBridgeContract.getRoot();
+ expect(rootSCMainnet).to.be.equal(rootJSMainnet);
+
+ // check merkle proof
+ const proof = merkleTree.getProofTreeByIndex(0);
+ const index = 0;
+
+ // verify merkle proof
+ expect(verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(true);
+ expect(await sovereignChainBridgeContract.verifyMerkleProof(leafValue, proof, index, rootSCMainnet)).to.be.equal(
+ true
+ );
+
+ });
+});
diff --git a/test/contractsv2/PolygonGlobalExitRootV2.test.ts b/test/contractsv2/PolygonGlobalExitRootV2.test.ts
index 2ff94ed15..e03740c1b 100644
--- a/test/contractsv2/PolygonGlobalExitRootV2.test.ts
+++ b/test/contractsv2/PolygonGlobalExitRootV2.test.ts
@@ -42,7 +42,7 @@ function calculateGlobalExitRootLeaf(newGlobalExitRoot: any, lastBlockHash: any,
[newGlobalExitRoot, lastBlockHash, timestamp]
);
}
-describe("Polygon Globlal exit root v2", () => {
+describe("Polygon Global exit root v2", () => {
let deployer: any;
let rollupManager: any;
let bridge: any;
@@ -77,7 +77,7 @@ describe("Polygon Globlal exit root v2", () => {
)) as PolygonZkEVMGlobalExitRootV2;
});
- it("should check the initalized parameters", async () => {
+ it("should check the initialized parameters", async () => {
expect(await polygonZkEVMGlobalExitRootV2.bridgeAddress()).to.be.equal(bridge.address);
expect(await polygonZkEVMGlobalExitRootV2.rollupManager()).to.be.equal(rollupManager.address);
expect(polygonZkEVMGlobalExitRoot.rollupAddress()).to.be.reverted;
@@ -93,12 +93,25 @@ describe("Polygon Globlal exit root v2", () => {
"OnlyAllowedContracts"
);
const blockUpdates = [];
-
- // Update root from the rollup
- await expect(polygonZkEVMGlobalExitRootV2.connect(rollupManager).updateExitRoot(newRootRollup))
+ // Update Exit root
+ const updateExitRoot = await polygonZkEVMGlobalExitRootV2.connect(rollupManager).updateExitRoot(newRootRollup);
+ // Retrieve l1InfoRoot
+ const currentL1InfoRoot = await polygonZkEVMGlobalExitRootV2.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRootV2.depositCount();
+
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(updateExitRoot?.blockHash as any);
+
+ // Check event
+ await expect(updateExitRoot)
.to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTree")
.withArgs(ethers.ZeroHash, newRootRollup);
+ await expect(updateExitRoot)
+ .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTreeV2")
+ .withArgs(currentL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
+
blockUpdates.push({
block: await ethers.provider.getBlock("latest"),
globalExitRoot: calculateGlobalExitRoot(ethers.ZeroHash, newRootRollup),
@@ -110,10 +123,23 @@ describe("Polygon Globlal exit root v2", () => {
// Update root from the PolygonZkEVMBridge
const newRootBridge = ethers.hexlify(ethers.randomBytes(32));
- await expect(polygonZkEVMGlobalExitRootV2.connect(bridge).updateExitRoot(newRootBridge))
+ // Update Bridge Exit root
+ const updateBridgeExitRoot = await polygonZkEVMGlobalExitRootV2.connect(bridge).updateExitRoot(newRootBridge);
+ // Retrieve l1InfoRoot
+ const newUpdatedL1InfoRoot = await polygonZkEVMGlobalExitRootV2.getRoot();
+ // Retrieve depositCount
+ const newDepositCount = await polygonZkEVMGlobalExitRootV2.depositCount();
+ // Retrieve parentHash and timestamp
+ const newBlockInfo = await ethers.provider.getBlock(updateBridgeExitRoot?.blockHash as any);
+
+ await expect(updateBridgeExitRoot)
.to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTree")
.withArgs(newRootBridge, newRootRollup);
+ await expect(updateBridgeExitRoot)
+ .to.emit(polygonZkEVMGlobalExitRootV2, "UpdateL1InfoTreeV2")
+ .withArgs(newUpdatedL1InfoRoot, newDepositCount, newBlockInfo?.parentHash, newBlockInfo?.timestamp);
+
const newGlobalExitRoot = calculateGlobalExitRoot(newRootBridge, newRootRollup);
blockUpdates.push({
block: await ethers.provider.getBlock("latest"),
diff --git a/test/contractsv2/PolygonPessimisticConsensus.test.ts b/test/contractsv2/PolygonPessimisticConsensus.test.ts
new file mode 100644
index 000000000..4da607412
--- /dev/null
+++ b/test/contractsv2/PolygonPessimisticConsensus.test.ts
@@ -0,0 +1,163 @@
+/* eslint-disable no-plusplus, no-await-in-loop */
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {Address, PolygonPessimisticConsensus} from "../../typechain-types";
+
+describe("PolygonPessimisticConsensus", () => {
+ let deployer: any;
+ let trustedSequencer: any;
+ let admin: any;
+
+ let PolygonPPConsensusContract: PolygonPessimisticConsensus;
+
+ const gerManagerAddress = "0xA00000000000000000000000000000000000000A" as unknown as Address;
+ const polTokenAddress = "0xB00000000000000000000000000000000000000B" as unknown as Address;
+ const rollupManagerAddress = "0xC00000000000000000000000000000000000000C" as unknown as Address;
+ const bridgeAddress = "0xD00000000000000000000000000000000000000D" as unknown as Address;
+
+ const urlSequencer = "http://zkevm-json-rpc:8123";
+ const networkName = "zkevm";
+ const networkID = 1;
+
+ // Native token will be ether
+ const gasTokenAddress = ethers.ZeroAddress;
+
+ beforeEach("Deploy contract", async () => {
+ upgrades.silenceWarnings();
+
+ // load signers
+ [deployer, trustedSequencer, admin] = await ethers.getSigners();
+
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await upgrades.deployProxy(ppConsensusFactory, [], {
+ initializer: false,
+ constructorArgs: [gerManagerAddress, polTokenAddress, bridgeAddress, rollupManagerAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
+ await PolygonPPConsensusContract.waitForDeployment();
+ });
+
+ it("should check the initalized parameters", async () => {
+ // initialize zkEVM using non admin address
+ await expect(
+ PolygonPPConsensusContract.initialize(
+ admin.address,
+ trustedSequencer.address,
+ networkID,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(PolygonPPConsensusContract, "OnlyRollupManager");
+
+ // initialize using rollup manager
+ await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerAddress]);
+ const rolllupManagerSigner = await ethers.getSigner(rollupManagerAddress as any);
+ await PolygonPPConsensusContract.connect(rolllupManagerSigner).initialize(
+ admin.address,
+ trustedSequencer.address,
+ networkID,
+ gasTokenAddress,
+ urlSequencer,
+ networkName,
+ {gasPrice: 0}
+ );
+
+ expect(await PolygonPPConsensusContract.admin()).to.be.equal(admin.address);
+ expect(await PolygonPPConsensusContract.trustedSequencer()).to.be.equal(trustedSequencer.address);
+ expect(await PolygonPPConsensusContract.trustedSequencerURL()).to.be.equal(urlSequencer);
+ expect(await PolygonPPConsensusContract.networkName()).to.be.equal(networkName);
+ expect(await PolygonPPConsensusContract.gasTokenAddress()).to.be.equal(gasTokenAddress);
+
+ // initialize again
+ await expect(
+ PolygonPPConsensusContract.connect(rolllupManagerSigner).initialize(
+ admin.address,
+ trustedSequencer.address,
+ networkID,
+ gasTokenAddress,
+ urlSequencer,
+ networkName,
+ {gasPrice: 0}
+ )
+ ).to.be.revertedWith("Initializable: contract is already initialized");
+ });
+
+ it("should check admin functions", async () => {
+ // initialize using rollup manager
+ await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerAddress]);
+ const rolllupManagerSigner = await ethers.getSigner(rollupManagerAddress as any);
+ await PolygonPPConsensusContract.connect(rolllupManagerSigner).initialize(
+ admin.address,
+ trustedSequencer.address,
+ networkID,
+ gasTokenAddress,
+ urlSequencer,
+ networkName,
+ {gasPrice: 0}
+ );
+
+ // setTrustedSequencer
+ await expect(PolygonPPConsensusContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError(
+ PolygonPPConsensusContract,
+ "OnlyAdmin"
+ );
+
+ await expect(PolygonPPConsensusContract.connect(admin).setTrustedSequencer(deployer.address))
+ .to.emit(PolygonPPConsensusContract, "SetTrustedSequencer")
+ .withArgs(deployer.address);
+
+ // setTrustedSequencerURL
+ await expect(PolygonPPConsensusContract.setTrustedSequencerURL("0x1253")).to.be.revertedWithCustomError(
+ PolygonPPConsensusContract,
+ "OnlyAdmin"
+ );
+ await expect(PolygonPPConsensusContract.connect(admin).setTrustedSequencerURL("0x1253"))
+ .to.emit(PolygonPPConsensusContract, "SetTrustedSequencerURL")
+ .withArgs("0x1253");
+
+ // transferAdminRole & acceptAdminRole
+ await expect(PolygonPPConsensusContract.connect(admin).transferAdminRole(deployer.address))
+ .to.emit(PolygonPPConsensusContract, "TransferAdminRole")
+ .withArgs(deployer.address);
+
+ await expect(PolygonPPConsensusContract.connect(admin).acceptAdminRole()).to.be.revertedWithCustomError(
+ PolygonPPConsensusContract,
+ "OnlyPendingAdmin"
+ );
+
+ await expect(PolygonPPConsensusContract.connect(deployer).acceptAdminRole())
+ .to.emit(PolygonPPConsensusContract, "AcceptAdminRole")
+ .withArgs(deployer.address);
+ });
+
+ it("should check getConsensusHash", async () => {
+ // initialize using rollup manager
+ await ethers.provider.send("hardhat_impersonateAccount", [rollupManagerAddress]);
+ const rolllupManagerSigner = await ethers.getSigner(rollupManagerAddress as any);
+ await PolygonPPConsensusContract.connect(rolllupManagerSigner).initialize(
+ admin.address,
+ trustedSequencer.address,
+ networkID,
+ gasTokenAddress,
+ urlSequencer,
+ networkName,
+ {gasPrice: 0}
+ );
+
+ // pessimistic constant CONSENSUS_TYPE = 0;
+ const CONSENSUS_TYPE = 0;
+ const consensusHashJs = ethers.solidityPackedKeccak256(
+ ["uint32", "address"],
+ [CONSENSUS_TYPE, trustedSequencer.address]
+ );
+
+ // getConsensusHash
+ const resGetConsensusHash = await PolygonPPConsensusContract.getConsensusHash();
+
+ expect(resGetConsensusHash).to.be.equal(consensusHashJs);
+ });
+});
diff --git a/test/contractsv2/PolygonRollupManager-Pessimistic.test.ts b/test/contractsv2/PolygonRollupManager-Pessimistic.test.ts
new file mode 100644
index 000000000..500870b55
--- /dev/null
+++ b/test/contractsv2/PolygonRollupManager-Pessimistic.test.ts
@@ -0,0 +1,1039 @@
+/* eslint-disable no-plusplus, no-await-in-loop */
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ VerifierRollupHelperMock,
+ ERC20PermitMock,
+ PolygonRollupManagerMock,
+ PolygonZkEVMGlobalExitRootV2,
+ PolygonZkEVMBridgeV2,
+ PolygonZkEVMEtrog,
+ PolygonRollupBaseEtrog,
+ TokenWrapped,
+ Address,
+ PolygonDataCommittee,
+ PolygonPessimisticConsensus,
+} from "../../typechain-types";
+import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers";
+const {VerifierType, computeInputPessimisticBytes, computeConsensusHashEcdsa} = require("../../src/pessimistic-utils");
+
+describe("Polygon Rollup Manager with Polygon Pessimistic Consensus", () => {
+ let deployer: any;
+ let timelock: any;
+ let emergencyCouncil: any;
+ let trustedAggregator: any;
+ let trustedSequencer: any;
+ let admin: any;
+ let beneficiary: any;
+
+ let verifierContract: VerifierRollupHelperMock;
+ let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2;
+ let polTokenContract: ERC20PermitMock;
+ let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2;
+ let rollupManagerContract: PolygonRollupManagerMock;
+ let PolygonPPConsensusContract: PolygonPessimisticConsensus;
+
+ const polTokenName = "POL Token";
+ const polTokenSymbol = "POL";
+ const polTokenInitialBalance = ethers.parseEther("20000000");
+
+ const pendingStateTimeoutDefault = 100;
+ const trustedAggregatorTimeout = 100;
+ const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days
+
+ // BRidge constants
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+
+ const LEAF_TYPE_ASSET = 0;
+ const LEAF_TYPE_MESSAGE = 1;
+
+ const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa" as unknown as Address;
+
+ let firstDeployment = true;
+
+ //roles
+ const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
+ const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE");
+ const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE");
+ const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE");
+ const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE");
+ const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE");
+ const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE");
+ const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN");
+ const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE");
+ const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE");
+ const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE");
+ const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE");
+ const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN");
+
+ const SIGNATURE_BYTES = 32 + 32 + 1;
+ const EFFECTIVE_PERCENTAGE_BYTES = 1;
+
+ beforeEach("Deploy contract", async () => {
+ upgrades.silenceWarnings();
+
+ // load signers
+ [deployer, trustedAggregator, trustedSequencer, admin, timelock, emergencyCouncil, beneficiary] =
+ await ethers.getSigners();
+
+ // deploy mock verifier
+ const VerifierRollupHelperFactory = await ethers.getContractFactory("VerifierRollupHelperMock");
+ verifierContract = await VerifierRollupHelperFactory.deploy();
+
+ // deploy pol
+ const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await polTokenFactory.deploy(
+ polTokenName,
+ polTokenSymbol,
+ deployer.address,
+ polTokenInitialBalance
+ );
+
+ /*
+ * deploy global exit root manager
+ * In order to not have trouble with nonce deploy first proxy admin
+ */
+ await upgrades.deployProxyAdmin();
+
+ if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") {
+ firstDeployment = false;
+ }
+ const nonceProxyBridge =
+ Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2);
+
+ const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes
+
+ const precalculateBridgeAddress = ethers.getCreateAddress({
+ from: deployer.address,
+ nonce: nonceProxyBridge,
+ });
+ const precalculateRollupManagerAddress = ethers.getCreateAddress({
+ from: deployer.address,
+ nonce: nonceProxyZkevm,
+ });
+ firstDeployment = false;
+
+ // deploy globalExitRoot
+ const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
+ polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
+ constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
+ // deploy PolygonZkEVMBridge
+ const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2");
+ polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ });
+
+ // deploy polygon rollup manager mock
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock");
+
+ rollupManagerContract = (await upgrades.deployProxy(PolygonRollupManagerFactory, [], {
+ initializer: false,
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ })) as unknown as PolygonRollupManagerMock;
+
+ await rollupManagerContract.waitForDeployment();
+
+ // check precalculated address
+ expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target);
+ expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target);
+
+ await polygonZkEVMBridgeContract.initialize(
+ networkIDMainnet,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ polygonZkEVMGlobalExitRoot.target,
+ rollupManagerContract.target,
+ "0x"
+ );
+
+ // Initialize Mock
+ await rollupManagerContract.initializeMock(
+ trustedAggregator.address,
+ pendingStateTimeoutDefault,
+ trustedAggregatorTimeout,
+ admin.address,
+ timelock.address,
+ emergencyCouncil.address
+ );
+
+ await expect(rollupManagerContract.initialize()).to.emit(rollupManagerContract, "UpdateRollupManagerVersion")
+
+ // fund sequencer address with Matic tokens
+ await polTokenContract.transfer(trustedSequencer.address, ethers.parseEther("1000"));
+ });
+
+ it("should check the initalized parameters", async () => {
+ expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target);
+ expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target);
+ expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target);
+
+ expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1"));
+ expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10"));
+ expect(await rollupManagerContract.calculateRewardPerBatch()).to.be.equal(0);
+
+ // Check roles
+ expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelock.address)).to.be.equal(true);
+
+ expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator.address)).to.be.equal(
+ true
+ );
+
+ expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true);
+
+ expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(
+ true
+ );
+ });
+
+ it("should add a new rollup type: PolygonConsensusPessimistic", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const newRollupTypeID = 1;
+ const nonZeroGenesis = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+
+ // sender does not have _ADD_ROLLUP_TYPE_ROLE role
+ await expect(
+ rollupManagerContract.addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+
+ // genesis != 0 on Pessimistic Verifier type
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ nonZeroGenesis,
+ description,
+ programVKey
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "InvalidRollupType");
+
+ // correct add new rollup via timelock
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ )
+ )
+ .to.emit(rollupManagerContract, "AddNewRollupType")
+ .withArgs(
+ newRollupTypeID,
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // assert new rollup type
+ const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID);
+
+ const expectedRollupType = [
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ false,
+ genesis,
+ programVKey,
+ ];
+
+ expect(createdRollupType).to.be.deep.equal(expectedRollupType);
+
+ // do obsoleteRollupType
+ await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError(
+ rollupManagerContract,
+ "AddressDoNotHaveRequiredRole"
+ );
+
+ await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID))
+ .to.emit(rollupManagerContract, "ObsoleteRollupType")
+ .withArgs(newRollupTypeID);
+ });
+
+ it("should create a new rollup: PolygonConsensusPessimistic", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const newRollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ )
+ )
+ .to.emit(rollupManagerContract, "AddNewRollupType")
+ .withArgs(
+ newRollupTypeID,
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimsitic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const newCreatedRollupID = 1;
+ const nonExistentRollupID = 4;
+
+ // Only admin can create new zkEVMs
+ await expect(
+ rollupManagerContract.createNewRollup(
+ newRollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+
+ // rollupTypeID does not exist
+ await expect(
+ rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ nonExistentRollupID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist");
+
+ // create new pessimistic
+ const newZKEVMAddress = ethers.getCreateAddress({
+ from: rollupManagerContract.target as string,
+ nonce: 1,
+ });
+ const newZkEVMContract = ppConsensusFactory.attach(newZKEVMAddress) as PolygonPessimisticConsensus;
+
+ await expect(
+ rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ newRollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ )
+ .to.emit(rollupManagerContract, "CreateNewRollup")
+ .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID, gasTokenAddress);
+
+ // assert new rollup created
+ expect(await newZkEVMContract.admin()).to.be.equal(admin.address);
+ expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address);
+ expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer);
+ expect(await newZkEVMContract.networkName()).to.be.equal(networkName);
+
+ // assert new rollup
+ const resRollupData = await rollupManagerContract.rollupIDToRollupDataV2(newCreatedRollupID);
+
+ const expectedRollupData = [
+ newZKEVMAddress,
+ chainID,
+ verifierContract.target,
+ forkID,
+ ethers.ZeroHash,
+ 0,
+ 0,
+ 0,
+ newRollupTypeID,
+ VerifierType.Pessimistic,
+ ethers.ZeroHash,
+ programVKey,
+ ];
+
+ expect(expectedRollupData).to.be.deep.equal(resRollupData);
+ });
+
+ it("should add an existing rollup: PolygonConsensusPessimistic", async () => {
+ // add existing rollup
+ const rollupAddress = "0xAa000000000000000000000000000000000000Bb";
+ const forkID = 1;
+ const chainID = 1;
+ const initLER = "0xff000000000000000000000000000000000000000000000000000000000000ff";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+
+ // add existing rollup: pessimistic type
+ const newCreatedRollupID = 1;
+
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .addExistingRollup(
+ rollupAddress,
+ verifierContract.target,
+ forkID,
+ chainID,
+ initLER,
+ VerifierType.Pessimistic,
+ programVKey
+ )
+ )
+ .to.emit(rollupManagerContract, "AddExistingRollup")
+ .withArgs(newCreatedRollupID, forkID, rollupAddress, chainID, VerifierType.Pessimistic, 0, programVKey);
+ });
+
+ it("should prevent to update rollup with different VerifierTypes", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const newRollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimsitic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const pessimisticRollupID = 1;
+
+ // create new pessimistic
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ newRollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // Create zkEVM implementation
+ const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog");
+ const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonZKEVMV2Contract.waitForDeployment();
+
+ // Add a new rollup type with timelock
+ const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
+ const description2 = "description";
+ const chainID2 = 2;
+ const stateTransistionRollupID = 2;
+
+ // add new rollup type StateTransistion with programVKey != 0
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonZKEVMV2Contract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.StateTransition,
+ genesisRandom,
+ description2,
+ programVKey
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "InvalidRollupType");
+
+ // add new rollup type stateTranstion correctly
+ const newRollupTypeID2 = 2;
+
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonZKEVMV2Contract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.StateTransition,
+ genesisRandom,
+ description2,
+ ethers.ZeroHash
+ );
+
+ // create new rollup
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ newRollupTypeID2,
+ chainID2,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // get rollup data
+ const rollupPessimistic = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+ const rollupStateTransition = await rollupManagerContract.rollupIDToRollupData(stateTransistionRollupID);
+
+ // try to update rollup from Pessimistic to stateTransition
+ await expect(
+ rollupManagerContract.connect(timelock).updateRollup(rollupPessimistic[0] as unknown as Address, 2, "0x")
+ ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateNotCompatible");
+
+ // try to update rollup from StateTransition to Pessimistic
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .updateRollup(rollupStateTransition[0] as unknown as Address, 1, "0x")
+ ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateNotCompatible");
+
+ // try to update rollup with rollupType = 0
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .updateRollup(rollupStateTransition[0] as unknown as Address, 0, "0x")
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist");
+
+ // try to update rollup with a greater rollupType that the last created
+ await expect(
+ rollupManagerContract
+ .connect(timelock)
+ .updateRollup(rollupStateTransition[0] as unknown as Address, 4, "0x")
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist");
+ });
+
+ it("should update rollup: pessismsitic type", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const rollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimsitic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const pessimisticRollupID = 1;
+
+ // create new pessimistic
+ const newZKEVMAddress = ethers.getCreateAddress({
+ from: rollupManagerContract.target as string,
+ nonce: 1,
+ });
+
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ rollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // Try to add a new rollup type
+ const newForkID = 11; // just metadata for pessimistic consensus
+ const newProgramVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const newRollupTypeID = 2;
+ const newVerifier = "0xaa000000000000000000000000000000000000bb" as unknown as Address;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ newVerifier,
+ newForkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ newProgramVKey
+ );
+
+ // get rollup data
+ const rollupPessimistic = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ // try to update rollup from StateTransition to Pessimistic
+ await rollupManagerContract
+ .connect(timelock)
+ .updateRollup(rollupPessimistic[0] as unknown as Address, newRollupTypeID, "0x");
+
+ // assert new rollup
+ const resRollupData = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ const expectedRollupData = [
+ newZKEVMAddress,
+ chainID,
+ newVerifier,
+ newForkID,
+ ethers.ZeroHash,
+ 0,
+ 0,
+ 0,
+ newRollupTypeID,
+ VerifierType.Pessimistic,
+ ethers.ZeroHash,
+ newProgramVKey,
+ ];
+
+ expect(expectedRollupData).to.be.deep.equal(resRollupData);
+ });
+
+ it("should not allow rollback sequences: pessismsitic type", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const rollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimsitic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const pessimisticRollupID = 1;
+
+ // create new pessimistic
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ rollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // get rollup data
+ const rollupPessimistic = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ // try to rollback sequences
+ await expect(
+ rollupManagerContract.connect(admin).rollbackBatches(rollupPessimistic[0] as unknown as Address, 2)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyStateTransitionChains");
+ });
+
+ it("should verify pessimistic proof: pessimistic type", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = "0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
+ const rollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimsitic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const pessimisticRollupID = 1;
+
+ // create new pessimistic
+ const newZKEVMAddress = ethers.getCreateAddress({
+ from: rollupManagerContract.target as string,
+ nonce: 1,
+ });
+
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ rollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // select unexistent global exit root
+ const unexistentL1InfoTreeCount = 2;
+ const newLER = "0x0000000000000000000000000000000000000000000000000000000000000001";
+ const newPPRoot = "0x0000000000000000000000000000000000000000000000000000000000000002";
+ const proofPP = "0x00";
+
+ // not trusted aggregator
+ await expect(
+ rollupManagerContract.verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ unexistentL1InfoTreeCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+
+ // global exit root does not exist
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ unexistentL1InfoTreeCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "L1InfoTreeLeafCountInvalid");
+
+ // create a bridge to generate a new GER and add another value in the l1IfoRootMap
+ const tokenAddress = ethers.ZeroAddress;
+ const amount = ethers.parseEther("1");
+ await polygonZkEVMBridgeContract.bridgeAsset(
+ pessimisticRollupID,
+ polTokenContract.target,
+ amount,
+ tokenAddress,
+ true,
+ "0x",
+ {
+ value: amount,
+ }
+ );
+
+ // get last L1InfoTreeLeafCount
+ const lastL1InfoTreeLeafCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ const lastL1InfoTreeRoot = await polygonZkEVMGlobalExitRoot.l1InfoRootMap(0);
+
+ // check JS function computeInputPessimisticBytes
+ const inputPessimisticBytes = await rollupManagerContract.getInputPessimisticBytes(
+ pessimisticRollupID,
+ lastL1InfoTreeRoot,
+ newLER,
+ newPPRoot
+ );
+
+ const infoRollup = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ const consensusHash = computeConsensusHashEcdsa(trustedSequencer.address);
+
+ const expectedInputPessimsiticBytes = computeInputPessimisticBytes(
+ infoRollup[4],
+ infoRollup[10],
+ lastL1InfoTreeRoot,
+ pessimisticRollupID,
+ consensusHash,
+ newLER,
+ newPPRoot
+ );
+
+ expect(inputPessimisticBytes).to.be.equal(expectedInputPessimsiticBytes);
+
+ // verify pessimistic
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ lastL1InfoTreeLeafCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ )
+ .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
+ .withArgs(pessimisticRollupID, 0, ethers.ZeroHash, newLER, trustedAggregator.address);
+
+ // assert rollup data
+ const resRollupData = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ const expectedRollupData = [
+ newZKEVMAddress,
+ chainID,
+ verifierContract.target,
+ forkID,
+ newLER,
+ 0,
+ 0,
+ 0,
+ rollupTypeID,
+ VerifierType.Pessimistic,
+ newPPRoot,
+ programVKey,
+ ];
+
+ expect(expectedRollupData).to.be.deep.equal(resRollupData);
+
+ // not allow verifyBatchesTrustedAggregator from a Pessimistic chain
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ pessimisticRollupID,
+ 0,
+ 0,
+ 0,
+ newLER,
+ newPPRoot,
+ beneficiary.address,
+ new Array(24).fill(ethers.ZeroHash)
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyStateTransitionChains");
+
+ // pendingstate != 0
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ pessimisticRollupID,
+ 42,
+ 0,
+ 0,
+ newLER,
+ newPPRoot,
+ beneficiary.address,
+ new Array(24).fill(ethers.ZeroHash)
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateNumExist");
+ });
+
+ it("should not verify pessimistic proof from stateTransistion chain", async () => {
+ // Create zkEVM implementation
+ const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog");
+ const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonZKEVMV2Contract.waitForDeployment();
+
+ // Add a new rollup type with timelock
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
+ const description = "description";
+ const forkID = 1;
+ const chainID = 1;
+ const stateTransistionRollupID = 1;
+
+ // add new rollup type stateTranstion correctly
+ const newRollupTypeID = 1;
+
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonZKEVMV2Contract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.StateTransition,
+ genesisRandom,
+ description,
+ ethers.ZeroHash
+ );
+
+ // create new rollup
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ newRollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // try to verify
+ const unexistentL1InfoTreeLeafcount = 2;
+ const newLER = "0x0000000000000000000000000000000000000000000000000000000000000001";
+ const newPPRoot = "0x0000000000000000000000000000000000000000000000000000000000000002";
+ const proofPP = "0x00";
+
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyPessimisticTrustedAggregator(
+ stateTransistionRollupID,
+ unexistentL1InfoTreeLeafcount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyChainsWithPessimisticProofs");
+ });
+});
diff --git a/test/contractsv2/PolygonRollupManager.test.ts b/test/contractsv2/PolygonRollupManager.test.ts
index 5c11ced5a..b12bbf44d 100644
--- a/test/contractsv2/PolygonRollupManager.test.ts
+++ b/test/contractsv2/PolygonRollupManager.test.ts
@@ -11,12 +11,10 @@ import {
PolygonRollupBaseEtrog,
TokenWrapped,
Address,
- PolygonValidiumStorageMigration,
PolygonDataCommittee,
- PolygonValidiumEtrogPrevious,
} from "../../typechain-types";
import {takeSnapshot, time} from "@nomicfoundation/hardhat-network-helpers";
-import {processorUtils, contractUtils, MTBridge, mtBridgeUtils} from "@0xpolygonhermez/zkevm-commonjs";
+import {processorUtils, contractUtils, MTBridge, mtBridgeUtils, utils} from "@0xpolygonhermez/zkevm-commonjs";
const {calculateSnarkInput, calculateAccInputHash, calculateBatchHashData} = contractUtils;
type BatchDataStructEtrog = PolygonRollupBaseEtrog.BatchDataStruct;
@@ -50,6 +48,7 @@ describe("Polygon Rollup Manager", () => {
const pendingStateTimeoutDefault = 100;
const trustedAggregatorTimeout = 100;
const FORCE_BATCH_TIMEOUT = 60 * 60 * 24 * 5; // 5 days
+ const HALT_AGGREGATION_TIMEOUT = 60 * 60 * 24 * 7; // 7 days
// BRidge constants
const networkIDMainnet = 0;
@@ -127,7 +126,6 @@ describe("Polygon Rollup Manager", () => {
// deploy globalExitRoot
const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
- initializer: false,
constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress],
unsafeAllow: ["constructor", "state-variable-immutable"],
});
@@ -186,9 +184,6 @@ describe("Polygon Rollup Manager", () => {
expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target);
expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target);
- expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault);
- expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout);
-
expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1"));
expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10"));
expect(await rollupManagerContract.calculateRewardPerBatch()).to.be.equal(0);
@@ -249,14 +244,49 @@ describe("Polygon Rollup Manager", () => {
expect(await polygonZkEVMBridgeContract.isEmergencyState()).to.be.equal(false);
});
+ it("should check _checkStateRootInsidePrime", async () => {
+ let stateRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(true);
+
+ // goldilocks - 1
+ stateRoot = "0x000000000000000000000000000000000000000000000000ffffffff00000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(true);
+
+ // goldilocks
+ stateRoot = "0x000000000000000000000000000000000000000000000000ffffffff00000001";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(false);
+
+ // goldilocks + 1
+ stateRoot = "0x000000000000000000000000000000000000000000000000ffffffff00000002";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(false);
+
+ // goldilocks 2nd element
+ stateRoot = "0x00000000000000000000000000000000ffffffff00000001ffffffff00000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(false);
+
+ // goldilocks 3rd element
+ stateRoot = "0x0000000000000000ffffffff00000001ffffffff00000000ffffffff00000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(false);
+
+ // goldilocks 4rt element
+ stateRoot = "0xffffffff00000001ffffffff00000000ffffffff00000000ffffffff00000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(false);
+
+ // all goldilocks - 1
+ stateRoot = "0xffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000";
+ expect(await rollupManagerContract.exposed_checkStateRootInsidePrime(stateRoot)).to.be.equal(true);
+ });
+
it("should check full flow etrog", async () => {
const urlSequencer = "http://zkevm-json-rpc:8123";
const chainID = 1000;
const networkName = "zkevm";
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
const gasTokenAddress = ethers.ZeroAddress;
const gasTokenNetwork = 0;
@@ -279,9 +309,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
@@ -294,9 +325,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -305,9 +337,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -317,9 +350,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -339,9 +373,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
true,
genesisRandom,
+ programVKey,
]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
await snapshot.restore();
@@ -360,6 +395,19 @@ describe("Polygon Rollup Manager", () => {
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+ // ChainId greater than 31 bits
+ await expect(
+ rollupManagerContract.connect(admin).createNewRollup(
+ newRollupTypeID,
+ 4294967296, // 2**32
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDOutOfRange");
+
// UNexisting rollupType
await expect(
rollupManagerContract
@@ -434,6 +482,10 @@ describe("Polygon Rollup Manager", () => {
expect(await newZkEVMContract.networkName()).to.be.equal(networkName);
expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT);
+ // Retrieve rollup batch info
+ const genesisStateRoot = await rollupManagerContract.getRollupBatchNumToStateRoot(newCreatedRollupID, 0);
+ expect(genesisStateRoot).to.be.equal(genesisRandom);
+
// Cannot create 2 chains with the same chainID
await expect(
rollupManagerContract
@@ -502,11 +554,11 @@ describe("Polygon Rollup Manager", () => {
expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupData.rollupVerifierType).to.be.equal(0);
const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
newCreatedRollupID,
@@ -545,19 +597,10 @@ describe("Polygon Rollup Manager", () => {
// Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
let currentLastBatchSequenced = 1;
- await expect(
- newZkEVMContract
- .connect(trustedSequencer)
- .sequenceBatches([sequence], currentTime, currentLastBatchSequenced++, trustedSequencer.address)
- ).to.emit(newZkEVMContract, "SequenceBatches");
-
- const lastBlock = await ethers.provider.getBlock("latest");
- const lastBlockHash = lastBlock?.parentHash;
- const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot();
+ const l1InfoTreeLeafCount = 0;
const height = 32;
const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
- const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp);
//merkleTreeGLobalExitRoot.add(leafValueJs);
const rootSC = await polygonZkEVMGlobalExitRoot.getRoot();
@@ -573,7 +616,43 @@ describe("Polygon Rollup Manager", () => {
trustedSequencer.address,
ethers.ZeroHash
);
- // calcualte accINputHash
+
+ // try to sequence in an emergency state
+ // snapshot emergency
+ const snapshotEmergencyStateSequence = await takeSnapshot();
+ await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState();
+
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash2,
+ trustedSequencer.address
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyNotEmergencyState");
+
+ await snapshotEmergencyStateSequence.restore();
+
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash2,
+ trustedSequencer.address
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
+
+ const lastBlock = await ethers.provider.getBlock("latest");
+ const lastBlockHash = lastBlock?.parentHash;
+ const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot();
+
+ // calculate accInputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
// Create a new local exit root mocking some bridge
@@ -642,14 +721,14 @@ describe("Polygon Rollup Manager", () => {
.verifyBatchesTrustedAggregator(
newCreatedRollupID,
pendingState,
- currentVerifiedBatch,
+ 1,
currentVerifiedBatch,
newLocalExitRoot,
newStateRoot,
beneficiary.address,
zkProofFFlonk
)
- ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch");
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OldStateRootDoesNotExist");
await expect(
rollupManagerContract
@@ -658,20 +737,14 @@ describe("Polygon Rollup Manager", () => {
newCreatedRollupID,
pendingState,
currentVerifiedBatch,
- 3,
+ currentVerifiedBatch,
newLocalExitRoot,
newStateRoot,
beneficiary.address,
zkProofFFlonk
)
- ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
-
- // Calcualte new globalExitroot
- const merkleTreeRollups = new MerkleTreeBridge(height);
- merkleTreeRollups.add(newLocalExitRoot);
- const rootRollups = merkleTreeRollups.getRoot();
+ ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch");
- // Verify batch
await expect(
rollupManagerContract
.connect(trustedAggregator)
@@ -679,17 +752,139 @@ describe("Polygon Rollup Manager", () => {
newCreatedRollupID,
pendingState,
currentVerifiedBatch,
- newVerifiedBatch,
+ 3,
newLocalExitRoot,
newStateRoot,
beneficiary.address,
zkProofFFlonk
)
- )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
+
+ // Calcualte new globalExitroot
+ const merkleTreeRollups = new MerkleTreeBridge(height);
+ merkleTreeRollups.add(newLocalExitRoot);
+ const rootRollups = merkleTreeRollups.getRoot();
+
+ // get input snark bytes
+ const oldSeqData = await rollupManagerContract.getRollupSequencedBatches(
+ newCreatedRollupID,
+ currentVerifiedBatch
+ );
+ const oldStateRoot = await rollupManagerContract.getRollupBatchNumToStateRoot(
+ newCreatedRollupID,
+ currentVerifiedBatch
+ );
+ const newSeqData = await rollupManagerContract.getRollupSequencedBatches(newCreatedRollupID, newVerifiedBatch);
+
+ const expectedHashInputSnarkBytes = await contractUtils.calculateSnarkInput(
+ oldStateRoot,
+ newStateRoot,
+ newLocalExitRoot,
+ oldSeqData[0],
+ newSeqData[0],
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ chainID,
+ deployer.address,
+ forkID
+ );
+
+ // check newStateroot inside golilocks
+ const failNewSR = "0x000000000000000000000000000000000000000000000000ffffffff00000001";
+ await expect(
+ rollupManagerContract.getInputSnarkBytes(
+ newCreatedRollupID,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ failNewSR
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "NewStateRootNotInsidePrime");
+
+ const inputSnark = await rollupManagerContract.getInputSnarkBytes(
+ newCreatedRollupID,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ oldStateRoot,
+ newStateRoot
+ );
+
+ const hashInputSnark = utils.sha256Snark(inputSnark.substring(2));
+ expect(hashInputSnark).to.be.equal(expectedHashInputSnarkBytes);
+
+ // Verify batch
+ const verifyBatchesTrustedAggregator = await rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ newCreatedRollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ );
+
+ // Retrieve l1InfoRoot
+ const currentL1InfoRoot = await polygonZkEVMGlobalExitRoot.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(verifyBatchesTrustedAggregator?.blockHash as any);
+
+ await expect(verifyBatchesTrustedAggregator)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
.withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
.to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(ethers.ZeroHash, rootRollups)
+ .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTreeV2")
+ .withArgs(currentL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
+
+ // try to set emergency state
+ await expect(rollupManagerContract.activateEmergencyState()).to.be.revertedWithCustomError(
+ rollupManagerContract,
+ "HaltTimeoutNotExpired"
+ );
+
+ // enter emergency state when timeout has passed
+ const enterEmergencyState = await takeSnapshot();
+ // Increment timestamp
+ const blockTime = (await ethers.provider.getBlock("latest"))?.timestamp as any;
+ await ethers.provider.send("evm_setNextBlockTimestamp", [blockTime + HALT_AGGREGATION_TIMEOUT + 1]);
+ // activate
+ await rollupManagerContract.connect(trustedAggregator).activateEmergencyState();
+ await enterEmergencyState.restore();
+
+ // try to enter emergency state when: timeout has passed but it has been an deactivated emergency state
+ const snapshotEmergencyTimeout = await takeSnapshot();
+ // Increment timestamp
+ const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp as any;
+ await ethers.provider.send("evm_setNextBlockTimestamp", [currentTimestamp + HALT_AGGREGATION_TIMEOUT / 2 - 1]);
+ // activate
+ await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState();
+ // deactivate
+ await rollupManagerContract.connect(admin).deactivateEmergencyState();
+ // Increment timestamp
+ const currentTimestampA = (await ethers.provider.getBlock("latest"))?.timestamp as any;
+ await ethers.provider.send("evm_setNextBlockTimestamp", [currentTimestampA + HALT_AGGREGATION_TIMEOUT / 2 + 2]);
+
+ // try to set emergency state
+ await expect(rollupManagerContract.activateEmergencyState()).to.be.revertedWithCustomError(
+ rollupManagerContract,
+ "HaltTimeoutNotExpired"
+ );
+
+ await snapshotEmergencyTimeout.restore();
+
+ // Retrieve rollup batch info
+ const batchStateRoot = await rollupManagerContract.getRollupBatchNumToStateRoot(
+ newCreatedRollupID,
+ newVerifiedBatch
+ );
+ expect(batchStateRoot).to.be.equal(newStateRoot);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
expect(finalAggregatorMatic).to.equal(initialAggregatorMatic + maticAmount);
@@ -830,9 +1025,10 @@ describe("Polygon Rollup Manager", () => {
newZkEVMContract.connect(admin).setForceBatchAddress(deployer.address)
).to.be.revertedWithCustomError(newZkEVMContract, "ForceBatchesDecentralized");
- //snapshot emergency
+ // snapshot emergency
const snapshotEmergencyState = await takeSnapshot();
await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState();
+
await expect(newZkEVMContract.forceBatch("0x", 0)).to.be.revertedWithCustomError(
newZkEVMContract,
"ForceBatchesNotAllowedOnEmergencyState"
@@ -871,6 +1067,15 @@ describe("Polygon Rollup Manager", () => {
const forcedBlock = await ethers.provider.getBlock("latest");
const currentTimestamp2 = forcedBlock?.timestamp;
+ const expectedAccInputHash3 = calculateAccInputHashetrog(
+ expectedAccInputHash2,
+ ethers.keccak256(l2txDataForceBatch),
+ lastGlobalExitRoot,
+ currentTimestamp2,
+ trustedSequencer.address,
+ forcedBlock?.parentHash
+ );
+
const sequenceForced = {
transactions: l2txDataForceBatch,
forcedGlobalExitRoot: lastGlobalExitRoot,
@@ -883,32 +1088,26 @@ describe("Polygon Rollup Manager", () => {
await expect(
newZkEVMContract
.connect(trustedSequencer)
- .sequenceBatches([sequenceForced], currentTime, currentLastBatchSequenced++, trustedSequencer.address)
+ .sequenceBatches(
+ [sequenceForced],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash3,
+ trustedSequencer.address
+ )
).to.emit(newZkEVMContract, "SequenceBatches");
- const expectedAccInputHash3 = calculateAccInputHashetrog(
- expectedAccInputHash2,
- ethers.keccak256(l2txDataForceBatch),
- lastGlobalExitRoot,
- currentTimestamp2,
- trustedSequencer.address,
- forcedBlock?.parentHash
- );
// calcualte accINputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3);
await snapshot3.restore();
+
// sequence force batches
const timestampForceBatch = (await ethers.provider.getBlock("latest"))?.timestamp as any;
// Increment timestamp
await ethers.provider.send("evm_setNextBlockTimestamp", [timestampForceBatch + FORCE_BATCH_TIMEOUT]);
- // sequence force batch
- await expect(newZkEVMContract.sequenceForceBatches([sequenceForced]))
- .to.emit(newZkEVMContract, "SequenceForceBatches")
- .withArgs(3);
-
// Check admin functions
await expect(newZkEVMContract.setTrustedSequencer(deployer.address)).to.be.revertedWithCustomError(
newZkEVMContract,
@@ -954,9 +1153,115 @@ describe("Polygon Rollup Manager", () => {
"OnlyPendingAdmin"
);
+ // sequence force batch
+ await expect(newZkEVMContract.sequenceForceBatches([sequenceForced]))
+ .to.emit(newZkEVMContract, "SequenceForceBatches")
+ .withArgs(3);
+
+ // Check rollback sequences
+ await expect(
+ rollupManagerContract.connect(trustedSequencer).rollbackBatches(newZkEVMContract.target, 0)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "NotAllowedAddress");
+
+ await expect(rollupManagerContract.rollbackBatches(newZkEVMContract.target, 0)).to.be.revertedWithCustomError(
+ rollupManagerContract,
+ "NotAllowedAddress"
+ );
+
+ await expect(
+ rollupManagerContract.connect(timelock).rollbackBatches(admin.address, 0)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollupMustExist");
+
+ // doe snot implement admin() method
+ await expect(rollupManagerContract.connect(admin).rollbackBatches(admin.address, 0)).to.be.reverted;
+
+ await expect(
+ rollupManagerContract.connect(timelock).rollbackBatches(newZkEVMContract.target, 0)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollbackBatchIsNotValid");
+
+ await expect(
+ rollupManagerContract.connect(admin).rollbackBatches(newZkEVMContract.target, 1)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollbackBatchIsNotValid");
+
+ await expect(
+ rollupManagerContract.connect(admin).rollbackBatches(newZkEVMContract.target, 10)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollbackBatchIsNotValid");
+
+ // last sequenced batch
+ await expect(
+ rollupManagerContract.connect(admin).rollbackBatches(newZkEVMContract.target, 3)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollbackBatchIsNotValid");
+
+ // compare accINputHash
+ expect(await newZkEVMContract.lastAccInputHash()).not.to.be.equal(expectedAccInputHash2);
+
+ const snapshotRollback = await takeSnapshot();
+
+ await expect(rollupManagerContract.connect(admin).rollbackBatches(newZkEVMContract.target, 2))
+ .to.emit(rollupManagerContract, "RollbackBatches")
+ .withArgs(newCreatedRollupID, 2, expectedAccInputHash2);
+
+ // compare accINputHash
+ expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
+ await snapshotRollback.restore();
+
await expect(newZkEVMContract.connect(deployer).acceptAdminRole())
.to.emit(newZkEVMContract, "AcceptAdminRole")
.withArgs(deployer.address);
+
+ // get last accInputHash
+ const rollupDataRes = await rollupManagerContract.rollupIDToRollupData(networkIDRollup);
+ const lastAccInputHash = await rollupManagerContract.getRollupSequencedBatches(
+ networkIDRollup,
+ rollupDataRes[5]
+ );
+
+ // Sequence two batches
+ // fund deployer with Matic tokens
+ await polTokenContract.transfer(deployer.address, ethers.parseEther("1000"));
+ // Approve tokens
+ await expect(polTokenContract.approve(newZkEVMContract.target, ethers.parseEther("1000"))).to.emit(
+ polTokenContract,
+ "Approval"
+ );
+
+ const currentTime2 = Number((await ethers.provider.getBlock("latest"))?.timestamp);
+ const indexL1InfoRoot = 0;
+ const l1InfoTreeRootSelected = await polygonZkEVMGlobalExitRoot.l1InfoRootMap(indexL1InfoRoot);
+
+ const accInputHash4 = calculateAccInputHashetrog(
+ lastAccInputHash[0],
+ ethers.keccak256(l2txData),
+ l1InfoTreeRootSelected,
+ currentTime2,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
+
+ const accInputHash5 = calculateAccInputHashetrog(
+ accInputHash4,
+ ethers.keccak256(l2txData),
+ l1InfoTreeRootSelected,
+ currentTime2,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
+
+ await expect(
+ newZkEVMContract.sequenceBatches(
+ [sequence, sequence],
+ indexL1InfoRoot,
+ currentTime2,
+ accInputHash5,
+ trustedSequencer.address
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
+
+ // try to rollback batches to a non finish sequence
+ await expect(rollupManagerContract.rollbackBatches(newZkEVMContract.target, 4)).to.be.revertedWithCustomError(
+ rollupManagerContract,
+ "RollbackBatchIsNotEndOfSequence"
+ );
});
it("should check full flow with gas Token etrog", async () => {
@@ -965,8 +1270,11 @@ describe("Polygon Rollup Manager", () => {
const networkName = "zkevm";
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ const lastPessimisticRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
// deploy pol
@@ -1009,9 +1317,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
@@ -1024,9 +1333,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -1035,9 +1345,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -1047,9 +1358,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -1069,9 +1381,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
true,
genesisRandom,
+ programVKey,
]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
await snapshot.restore();
@@ -1090,6 +1403,19 @@ describe("Polygon Rollup Manager", () => {
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+ // ChainId greater than 31 bits
+ await expect(
+ rollupManagerContract.connect(admin).createNewRollup(
+ newRollupTypeID,
+ 4294967296, // 2**32
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDOutOfRange");
+
// Unexisting rollupType
await expect(
rollupManagerContract
@@ -1232,11 +1558,11 @@ describe("Polygon Rollup Manager", () => {
expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupData.rollupVerifierType).to.be.equal(0);
const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
newCreatedRollupID,
@@ -1272,17 +1598,26 @@ describe("Polygon Rollup Manager", () => {
"Approval"
);
- // Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- let currentLastBatchSequenced = 1;
-
+ const l1InfoTreeLeafCount = 0;
+ const expectedAccInputHash1 = calculateAccInputHashetrog(
+ await newZkEVMContract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.l1InfoRootMap(l1InfoTreeLeafCount),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
+ // Sequence Batches
const txSequenceBatches = await newZkEVMContract
.connect(trustedSequencer)
- .sequenceBatches([sequence], currentTime, currentLastBatchSequenced++, trustedSequencer.address);
-
- const lastBlock = await ethers.provider.getBlock("latest");
- const lastBlockHash = lastBlock?.parentHash;
- const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot();
+ .sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash1,
+ trustedSequencer.address
+ );
const receipt = await txSequenceBatches.wait();
const logs = receipt.logs;
@@ -1398,30 +1733,51 @@ describe("Polygon Rollup Manager", () => {
)
).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
- // Calcualte new globalExitroot
+ // Calculate new globalExitRoot
const merkleTreeRollups = new MerkleTreeBridge(height);
- merkleTreeRollups.add(newLocalExitRoot);
+ merkleTreeRollups.add(merkleTreezkEVM.getRoot());
const rootRollups = merkleTreeRollups.getRoot();
+ const lastGlobalExitRootS2 = calculateGlobalExitRoot(ethers.ZeroHash, rootRollups);
+ const lastBlock2 = await ethers.provider.getBlock("latest");
+ const lastBlockHash2 = lastBlock2?.hash;
+ const leafValueUpdateGER2 = calculateGlobalExitRootLeaf(
+ lastGlobalExitRootS2,
+ lastBlockHash2,
+ lastBlock2?.timestamp + 5
+ );
+ merkleTreeGLobalExitRoot.add(leafValueUpdateGER2);
+ const currentL1InfoRoot = merkleTreeGLobalExitRoot.getRoot();
+ await ethers.provider.send("evm_setNextBlockTimestamp", [lastBlock2?.timestamp + 5]);
+
// Verify batch
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
+ const verifyBatchesTrustedAggregator = await rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ newCreatedRollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ );
+
+ // Retrieve l1InfoRoot
+ const newL1InfoRoot = await polygonZkEVMGlobalExitRoot.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(verifyBatchesTrustedAggregator?.blockHash as any);
+
+ await expect(verifyBatchesTrustedAggregator)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
.withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
.to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(ethers.ZeroHash, rootRollups)
+ .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTreeV2")
+ .withArgs(newL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
@@ -1544,8 +1900,11 @@ describe("Polygon Rollup Manager", () => {
const networkName = "zkevm";
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ const lastPessimisticRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
// deploy pol
@@ -1573,7 +1932,7 @@ describe("Polygon Rollup Manager", () => {
// In order to create a new rollup type, create an implementation of the contract
// Create zkEVM implementation
- const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrogPrevious");
+ const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog");
const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
polygonZkEVMGlobalExitRoot.target,
polTokenContract.target,
@@ -1588,9 +1947,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
@@ -1603,9 +1963,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -1614,9 +1975,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -1626,9 +1988,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -1648,9 +2011,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
true,
genesisRandom,
+ programVKey,
]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
await snapshot.restore();
@@ -1670,7 +2034,20 @@ describe("Polygon Rollup Manager", () => {
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
- // UNexisting rollupType
+ // ChainId greater than 31 bits
+ await expect(
+ rollupManagerContract.connect(admin).createNewRollup(
+ newRollupTypeID,
+ 4294967296, // 2**32
+ admin.address,
+ trustedSequencer.address,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDOutOfRange");
+
+ // Unexisting rollupType
await expect(
rollupManagerContract
.connect(admin)
@@ -1812,11 +2189,11 @@ describe("Polygon Rollup Manager", () => {
expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupData.rollupVerifierType).to.be.equal(0);
const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
newCreatedRollupID,
@@ -1847,10 +2224,7 @@ describe("Polygon Rollup Manager", () => {
// Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- let currentLastBatchSequenced = 0;
- await expect(
- newZkEVMContract.connect(trustedSequencer).sequenceBatches([sequence], trustedSequencer.address)
- ).to.emit(newZkEVMContract, "SequenceBatches");
+ const l1InfoTreeLeafCount = 0;
const lastBlock = await ethers.provider.getBlock("latest");
@@ -1865,6 +2239,18 @@ describe("Polygon Rollup Manager", () => {
ethers.ZeroHash
);
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash2,
+ trustedSequencer.address
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
+
// calcualte accINputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
@@ -1959,30 +2345,57 @@ describe("Polygon Rollup Manager", () => {
)
).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
+ await expect(
+ rollupManagerContract.connect(admin).updateRollupByRollupAdmin(newZKEVMAddress, 10)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "AllSequencedMustBeVerified");
+
// Calcualte new globalExitroot
const merkleTreeRollups = new MerkleTreeBridge(height);
merkleTreeRollups.add(newLocalExitRoot);
const rootRollups = merkleTreeRollups.getRoot();
+ const lastGlobalExitRootS2 = calculateGlobalExitRoot(ethers.ZeroHash, rootRollups);
+ const lastBlock2 = await ethers.provider.getBlock("latest");
+ const lastBlockHash2 = lastBlock2?.hash;
+ const leafValueUpdateGER2 = calculateGlobalExitRootLeaf(
+ lastGlobalExitRootS2,
+ lastBlockHash2,
+ lastBlock2?.timestamp + 5
+ );
+ const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
+ merkleTreeGLobalExitRoot.add(leafValueUpdateGER2);
+ const currentL1InfoRoot = merkleTreeGLobalExitRoot.getRoot();
+
+ await ethers.provider.send("evm_setNextBlockTimestamp", [lastBlock2?.timestamp + 5]);
+
// Verify batch
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
+ const verifyBatchesTrustedAggregator = await rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ newCreatedRollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ );
+
+ // Retrieve l1InfoRoot
+ const newL1InfoRoot = await polygonZkEVMGlobalExitRoot.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(verifyBatchesTrustedAggregator?.blockHash as any);
+
+ await expect(verifyBatchesTrustedAggregator)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
.withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
.to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(ethers.ZeroHash, rootRollups)
+ .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTreeV2")
+ .withArgs(newL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
@@ -2120,9 +2533,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMEtrogContract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -2131,13 +2545,15 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMEtrogContract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
- // Add a new rollup type with timelock
- const randomType = 3;
+ // Add a new rollup type (pessimistic) with timelock
+ const newRandomTypeID = 3;
+ const rollupVerifierTypeNew = 1;
await expect(
rollupManagerContract
.connect(timelock)
@@ -2145,37 +2561,42 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMEtrogContract.target,
verifierContract.target,
forkID,
- randomType,
- genesisRandom,
- descirption
+ rollupVerifierTypeNew,
+ programVKey,
+ description,
+ genesisRandom
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
.withArgs(
- randomType,
+ newRandomTypeID,
PolygonZKEVMEtrogContract.target,
verifierContract.target,
forkID,
- randomType,
- genesisRandom,
- descirption
+ rollupVerifierTypeNew,
+ programVKey,
+ description,
+ genesisRandom
);
// assert new rollup type
- const createdEtrogRollupType = await rollupManagerContract.rollupTypeMap(etrogRollupType);
+ const createdEtrogRollupType = await rollupManagerContract.rollupTypeMap(newRandomTypeID);
const expectedEtrogRollupType = [
PolygonZKEVMEtrogContract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierTypeNew,
false,
+ programVKey,
genesisRandom,
];
expect(createdEtrogRollupType).to.be.deep.equal(expectedEtrogRollupType);
// Validate upgrade OZ
- await upgrades.validateUpgrade(PolygonZKEVMV2Factory, PolygonZKEVMEtrogFactory, {
+ const PolygonPreviousFactory = await ethers.getContractFactory("PolygonZkEVMEtrogPrevious");
+
+ await upgrades.validateUpgrade(PolygonPreviousFactory, PolygonZKEVMEtrogFactory, {
constructorArgs: [
polygonZkEVMGlobalExitRoot.target,
polTokenContract.target,
@@ -2196,6 +2617,15 @@ describe("Polygon Rollup Manager", () => {
.updateRollup(polygonZkEVMGlobalExitRoot.target, etrogRollupType, "0x")
).to.be.revertedWithCustomError(rollupManagerContract, "RollupMustExist");
+ // Try update random address
+ await expect(
+ rollupManagerContract.connect(timelock).updateRollupByRollupAdmin(newZKEVMAddress, etrogRollupType)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyRollupAdmin");
+
+ await expect(
+ rollupManagerContract.connect(admin).updateRollupByRollupAdmin(newZKEVMAddress, 0)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateToOldRollupTypeID");
+
// Try update same type
await expect(
rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, 1, "0x")
@@ -2206,11 +2636,6 @@ describe("Polygon Rollup Manager", () => {
rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, 4, "0x")
).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist");
- // Try update to not comaptible type
- await expect(
- rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, randomType, "0x")
- ).to.be.revertedWithCustomError(rollupManagerContract, "UpdateNotCompatible");
-
// obsoleteRollupType, take snapshot for it
const snapshotUpdateRollup = await takeSnapshot();
@@ -2222,6 +2647,10 @@ describe("Polygon Rollup Manager", () => {
rollupManagerContract.connect(timelock).updateRollup(newZKEVMAddress, etrogRollupType, "0x")
).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete");
+ await expect(
+ rollupManagerContract.connect(admin).updateRollupByRollupAdmin(newZKEVMAddress, etrogRollupType)
+ ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete");
+
await snapshotUpdateRollup.restore();
expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal(
@@ -2241,15 +2670,32 @@ describe("Polygon Rollup Manager", () => {
expect(rollupDataFinal.lastLocalExitRoot).to.be.equal(newLocalExitRoot);
expect(rollupDataFinal.lastBatchSequenced).to.be.equal(newVerifiedBatch);
expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(newVerifiedBatch);
- expect(rollupDataFinal.lastPendingState).to.be.equal(0);
- expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(newVerifiedBatch);
expect(rollupDataFinal.rollupTypeID).to.be.equal(etrogRollupType);
- expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupDataFinal.rollupVerifierType).to.be.equal(0);
expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal(
PolygonZKEVMEtrogContract.target
);
+
+ // try to verify a batch smaller than the lastVerifiedBatchBeforeUpgrade
+ // Verify batch
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ newCreatedRollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "InitBatchMustMatchCurrentForkID");
});
it("should check full flow upgrading validium storage migration", async () => {
@@ -2258,8 +2704,11 @@ describe("Polygon Rollup Manager", () => {
const networkName = "zkevm";
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ const lastPessimisticRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
// deploy pol
@@ -2287,7 +2736,7 @@ describe("Polygon Rollup Manager", () => {
// In order to create a new rollup type, create an implementation of the contract
// Create zkEVM implementation
- const PolygonValidiumPreviousVersion = await ethers.getContractFactory("PolygonValidiumEtrogPrevious");
+ const PolygonValidiumPreviousVersion = await ethers.getContractFactory("PolygonValidiumEtrog");
const PolygonZKEVMV2Contract = await PolygonValidiumPreviousVersion.deploy(
polygonZkEVMGlobalExitRoot.target,
polTokenContract.target,
@@ -2305,9 +2754,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -2316,9 +2766,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -2328,9 +2779,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -2427,11 +2879,11 @@ describe("Polygon Rollup Manager", () => {
expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupData.rollupVerifierType).to.be.equal(0);
const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
newCreatedRollupID,
@@ -2475,25 +2927,30 @@ describe("Polygon Rollup Manager", () => {
expect(await newZkEVMContract.dataAvailabilityProtocol()).to.be.equal(PolygonDataCommitee.target);
await PolygonDataCommitee.setupCommittee(0, [], "0x");
-
- await expect(
- newZkEVMContract
- .connect(trustedSequencer)
- .sequenceBatchesValidium([sequence], trustedSequencer.address, "0x")
- ).to.emit(newZkEVMContract, "SequenceBatches");
-
+ const l1InfoTreeLeafCount = 0;
const lastBlock = await ethers.provider.getBlock("latest");
const rootSC = await polygonZkEVMGlobalExitRoot.getRoot();
-
const expectedAccInputHash2 = calculateAccInputHashetrog(
- expectedAccInputHash,
+ await newZkEVMContract.lastAccInputHash(),
ethers.keccak256(l2txData),
rootSC,
- lastBlock?.timestamp,
+ currentTime,
trustedSequencer.address,
ethers.ZeroHash
);
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatchesValidium(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash2,
+ trustedSequencer.address,
+ "0x"
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
// calcualte accINputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
@@ -2512,25 +2969,48 @@ describe("Polygon Rollup Manager", () => {
const merkleTreeRollups = new MerkleTreeBridge(32);
const rootRollups = merkleTreeRollups.getRoot();
+ const lastGlobalExitRootS2 = calculateGlobalExitRoot(ethers.ZeroHash, rootRollups);
+ const lastBlock2 = await ethers.provider.getBlock("latest");
+ const lastBlockHash2 = lastBlock2?.hash;
+ const leafValueUpdateGER2 = calculateGlobalExitRootLeaf(
+ lastGlobalExitRootS2,
+ lastBlockHash2,
+ lastBlock2?.timestamp + 5
+ );
+ const height = 32;
+ const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
+ merkleTreeGLobalExitRoot.add(leafValueUpdateGER2);
+ const currentL1InfoRoot = merkleTreeGLobalExitRoot.getRoot();
+ await ethers.provider.send("evm_setNextBlockTimestamp", [lastBlock2?.timestamp + 5]);
+
// Verify batch
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
+ const verifyBatchesTrustedAggregator = await rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ newCreatedRollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ );
+
+ // Retrieve l1InfoRoot
+ const newL1InfoRoot = await polygonZkEVMGlobalExitRoot.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(verifyBatchesTrustedAggregator?.blockHash as any);
+
+ await expect(verifyBatchesTrustedAggregator)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
.withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
.to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(ethers.ZeroHash, rootRollups)
+ .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTreeV2")
+ .withArgs(newL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
@@ -2543,150 +3023,6 @@ describe("Polygon Rollup Manager", () => {
expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal(
calculateGlobalExitRoot(ethers.ZeroHash, rootRollups)
);
-
- // Upgrade rollup
- // In order to update a new rollup type, create an implementation of the contract
-
- // Create zkEVM implementation
- const PolygonValidiumStorageMigration = await ethers.getContractFactory("PolygonValidiumStorageMigration");
- const PolygonValidiumMigrationContract = await PolygonValidiumStorageMigration.deploy(
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target
- );
- await PolygonValidiumMigrationContract.waitForDeployment();
-
- // Add a new rollup type with timelock
- const etrogRollupType = 2;
- await expect(
- rollupManagerContract
- .connect(timelock)
- .addNewRollupType(
- PolygonValidiumMigrationContract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- genesisRandom,
- descirption
- )
- )
- .to.emit(rollupManagerContract, "AddNewRollupType")
- .withArgs(
- etrogRollupType,
- PolygonValidiumMigrationContract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- genesisRandom,
- descirption
- );
-
- // Add a new rollup type with timelock
- const randomType = 3;
- await expect(
- rollupManagerContract
- .connect(timelock)
- .addNewRollupType(
- PolygonValidiumMigrationContract.target,
- verifierContract.target,
- forkID,
- randomType,
- genesisRandom,
- descirption
- )
- )
- .to.emit(rollupManagerContract, "AddNewRollupType")
- .withArgs(
- randomType,
- PolygonValidiumMigrationContract.target,
- verifierContract.target,
- forkID,
- randomType,
- genesisRandom,
- descirption
- );
-
- // assert new rollup type
- const createdEtrogRollupType = await rollupManagerContract.rollupTypeMap(etrogRollupType);
-
- const expectedEtrogRollupType = [
- PolygonValidiumMigrationContract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- false,
- genesisRandom,
- ];
- expect(createdEtrogRollupType).to.be.deep.equal(expectedEtrogRollupType);
-
- // Validate upgrade OZ
-
- await upgrades.validateUpgrade(PolygonValidiumPreviousVersion, PolygonValidiumStorageMigration, {
- constructorArgs: [
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target,
- ],
- unsafeAllow: ["constructor", "state-variable-immutable"],
- } as any);
-
- expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal(
- PolygonZKEVMV2Contract.target
- );
-
- await expect(
- rollupManagerContract
- .connect(timelock)
- .updateRollup(
- newZKEVMAddress,
- etrogRollupType,
- PolygonValidiumStorageMigration.interface.encodeFunctionData("initializeMigration", [])
- )
- )
- .to.emit(rollupManagerContract, "UpdateRollup")
- .withArgs(newRollupTypeID, etrogRollupType, newVerifiedBatch);
-
- // Check mapping on rollup Manager
- const rollupDataFinal = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupDataFinal.rollupContract).to.be.equal(newZKEVMAddress);
- expect(rollupDataFinal.chainID).to.be.equal(chainID);
- expect(rollupDataFinal.verifier).to.be.equal(verifierContract.target);
- expect(rollupDataFinal.forkID).to.be.equal(forkID);
- expect(rollupDataFinal.lastLocalExitRoot).to.be.equal(newLocalExitRoot);
- expect(rollupDataFinal.lastBatchSequenced).to.be.equal(newVerifiedBatch);
- expect(rollupDataFinal.lastVerifiedBatch).to.be.equal(newVerifiedBatch);
- expect(rollupDataFinal.lastPendingState).to.be.equal(0);
- expect(rollupDataFinal.lastPendingStateConsolidated).to.be.equal(0);
- expect(rollupDataFinal.lastVerifiedBatchBeforeUpgrade).to.be.equal(newVerifiedBatch);
- expect(rollupDataFinal.rollupTypeID).to.be.equal(etrogRollupType);
- expect(rollupDataFinal.rollupCompatibilityID).to.be.equal(0);
-
- expect(await upgrades.erc1967.getImplementationAddress(newZKEVMAddress as string)).to.be.equal(
- PolygonValidiumMigrationContract.target
- );
-
- expect(await newZkEVMContract.dataAvailabilityProtocol()).to.be.equal(PolygonDataCommitee.target);
-
- // // Finally check compatibility with current ROllups:
- // const PolygonCurrentValidium = await ethers.getContractFactory("PolygonValidiumEtrog");
- // const PolygonCurrentValidiumContract = await PolygonCurrentValidium.deploy(
- // polygonZkEVMGlobalExitRoot.target,
- // polTokenContract.target,
- // polygonZkEVMBridgeContract.target,
- // rollupManagerContract.target
- // );
- // await PolygonCurrentValidiumContract.waitForDeployment();
- // await upgrades.validateUpgrade(PolygonValidiumStorageMigration, PolygonCurrentValidium, {
- // constructorArgs: [
- // polygonZkEVMGlobalExitRoot.target,
- // polTokenContract.target,
- // polygonZkEVMBridgeContract.target,
- // rollupManagerContract.target,
- // ],
- // unsafeAllow: ["constructor", "state-variable-immutable"],
- // } as any);
});
it("should add existing rollup and test full flow", async () => {
@@ -2695,8 +3031,11 @@ describe("Polygon Rollup Manager", () => {
const networkName = "zkevm";
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ const lastPessimisticRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
const gasTokenAddress = ethers.ZeroAddress;
const gasTokenNetwork = 0;
@@ -2705,12 +3044,17 @@ describe("Polygon Rollup Manager", () => {
// Create zkEVM implementation
const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMExistentEtrog");
- const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target
- );
+ const PolygonZKEVMV2Contract = await upgrades.deployProxy(PolygonZKEVMV2Factory, [], {
+ initializer: false,
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
await PolygonZKEVMV2Contract.waitForDeployment();
// Add a new rollup type with timelock
@@ -2754,10 +3098,24 @@ describe("Polygon Rollup Manager", () => {
forkID,
chainID,
genesisRandom,
- rollupCompatibilityID
+ rollupVerifierType,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+ // ChainId greater than 31 bits
+ await expect(
+ rollupManagerContract.connect(timelock).addExistingRollup(
+ PolygonZKEVMV2Contract.target,
+ verifierContract.target,
+ forkID,
+ 4294967296, // 2**32
+ genesisRandom,
+ rollupVerifierType,
+ programVKey
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDOutOfRange");
+
await expect(
rollupManagerContract
.connect(timelock)
@@ -2767,11 +3125,16 @@ describe("Polygon Rollup Manager", () => {
forkID,
chainID,
genesisRandom,
- rollupCompatibilityID
+ rollupVerifierType,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddExistingRollup")
- .withArgs(RollupID, forkID, PolygonZKEVMV2Contract.target, chainID, rollupCompatibilityID, 0);
+ .withArgs(RollupID, forkID, PolygonZKEVMV2Contract.target, chainID, rollupVerifierType, 0, programVKey);
+
+ // Retrieve rollup batch info
+ const genesisStateRoot = await rollupManagerContract.getRollupBatchNumToStateRoot(RollupID, 0);
+ expect(genesisStateRoot).to.be.equal(genesisRandom);
await expect(
rollupManagerContract
@@ -2782,7 +3145,8 @@ describe("Polygon Rollup Manager", () => {
forkID,
chainID,
genesisRandom,
- rollupCompatibilityID
+ rollupVerifierType,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist");
@@ -2795,7 +3159,8 @@ describe("Polygon Rollup Manager", () => {
forkID,
chainID + 1,
genesisRandom,
- rollupCompatibilityID
+ rollupVerifierType,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "RollupAddressAlreadyExist");
@@ -2851,12 +3216,21 @@ describe("Polygon Rollup Manager", () => {
// Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- let currentLastBatchSequenced = 1;
+ const l1InfoTreeLeafCount = 0;
+ const expectedAccInputHash = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.getRoot(),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced++,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
@@ -2971,25 +3345,47 @@ describe("Polygon Rollup Manager", () => {
merkleTreeRollups.add(newLocalExitRoot);
const rootRollups = merkleTreeRollups.getRoot();
+ const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
+ const lastGlobalExitRootS2 = calculateGlobalExitRoot(ethers.ZeroHash, rootRollups);
+ const lastBlock2 = await ethers.provider.getBlock("latest");
+ const lastBlockHash2 = lastBlock2?.hash;
+ const leafValueUpdateGER2 = calculateGlobalExitRootLeaf(
+ lastGlobalExitRootS2,
+ lastBlockHash2,
+ lastBlock2?.timestamp + 5
+ );
+ merkleTreeGLobalExitRoot.add(leafValueUpdateGER2);
+ const currentL1InfoRoot = merkleTreeGLobalExitRoot.getRoot();
+ await ethers.provider.send("evm_setNextBlockTimestamp", [lastBlock2?.timestamp + 5]);
+
// Verify batch
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- RollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
+ const verifyBatchesTrustedAggregator = await rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyBatchesTrustedAggregator(
+ RollupID,
+ pendingState,
+ currentVerifiedBatch,
+ newVerifiedBatch,
+ newLocalExitRoot,
+ newStateRoot,
+ beneficiary.address,
+ zkProofFFlonk
+ );
+
+ // Retrieve l1InfoRoot
+ const newL1InfoRoot = await polygonZkEVMGlobalExitRoot.getRoot();
+ // Retrieve depositCount
+ const depositCount = await polygonZkEVMGlobalExitRoot.depositCount();
+ // Retrieve parentHash and timestamp
+ const blockInfo = await ethers.provider.getBlock(verifyBatchesTrustedAggregator?.blockHash as any);
+
+ await expect(verifyBatchesTrustedAggregator)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
.withArgs(RollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
.to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(ethers.ZeroHash, rootRollups)
+ .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTreeV2")
+ .withArgs(newL1InfoRoot, depositCount, blockInfo?.parentHash, blockInfo?.timestamp);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
@@ -3110,8 +3506,10 @@ describe("Polygon Rollup Manager", () => {
it("Should test obsolete rollup", async () => {
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+ const lastPessimisticRoot = "0x0000000000000000000000000000000000000000000000000000000000000000";
// In order to create a new rollup type, create an implementation of the contract
@@ -3134,9 +3532,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -3145,9 +3544,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -3157,9 +3557,10 @@ describe("Polygon Rollup Manager", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -3220,7 +3621,7 @@ describe("Polygon Rollup Manager", () => {
});
/**
- * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, globalExitRoot, timestamp, seqAddress)
+ * Compute accumulateInputHash = Keccak256(oldAccInputHash, batchHashData, l1InfoTreeRoot, timestamp, seqAddress)
* @param {String} oldAccInputHash - old accumulateInputHash
* @param {String} batchHashData - Batch hash data
* @param {String} globalExitRoot - Global Exit Root
@@ -3231,14 +3632,14 @@ describe("Polygon Rollup Manager", () => {
function calculateAccInputHashetrog(
oldAccInputHash: any,
batchHashData: any,
- globalExitRoot: any,
+ l1InfoTreeRoot: any,
timestamp: any,
sequencerAddress: any,
forcedBlockHash: any
) {
const hashKeccak = ethers.solidityPackedKeccak256(
["bytes32", "bytes32", "bytes32", "uint64", "address", "bytes32"],
- [oldAccInputHash, batchHashData, globalExitRoot, timestamp, sequencerAddress, forcedBlockHash]
+ [oldAccInputHash, batchHashData, l1InfoTreeRoot, timestamp, sequencerAddress, forcedBlockHash]
);
return hashKeccak;
diff --git a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts
index 9f9e8cd75..64e530418 100644
--- a/test/contractsv2/PolygonRollupManagerUpgrade.test.ts
+++ b/test/contractsv2/PolygonRollupManagerUpgrade.test.ts
@@ -57,6 +57,7 @@ describe("Polygon Rollup manager upgraded", () => {
let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2;
let rollupManagerContract: PolygonRollupManagerMock;
+ const latestVersionRollupManager = "pessimistic";
const polTokenName = "POL Token";
const polTokenSymbol = "POL";
const polTokenInitialBalance = ethers.parseEther("20000000");
@@ -145,7 +146,6 @@ describe("Polygon Rollup manager upgraded", () => {
// deploy globalExitRoot
const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
polygonZkEVMGlobalExitRoot = (await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
- initializer: false,
constructorArgs: [precalculatezkEVM, precalculateBridgeAddress],
unsafeAllow: ["constructor", "state-variable-immutable"],
})) as any;
@@ -175,9 +175,12 @@ describe("Polygon Rollup manager upgraded", () => {
expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target);
expect(precalculatezkEVM).to.be.equal(polygonZkEVMContract.target);
- const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock");
- rollupManagerContract = PolygonRollupManagerFactory.attach(polygonZkEVMContract.target) as any;
+ // get previous versions
+ const PolygonRollupManagerFactoryV1toV2 = await ethers.getContractFactory("PolygonRollupManagerPreviousV1toV2");
+ const PolygonRollupManagerFactoryPrevious = await ethers.getContractFactory("PolygonRollupManagerPrevious");
+ const PolygonRollupManagerFactoryCurrent = await ethers.getContractFactory("PolygonRollupManagerMock");
+ rollupManagerContract = PolygonRollupManagerFactoryCurrent.attach(polygonZkEVMContract.target) as any;
await polygonZkEVMContract.initialize(
{
admin: admin.address,
@@ -218,15 +221,15 @@ describe("Polygon Rollup manager upgraded", () => {
unsafeAllow: ["constructor", "state-variable-immutable"],
})) as any as PolygonZkEVMExistentEtrog;
- //const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
- const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactory, {
+ // upgrade from V1 to V2
+ const txRollupManager = await upgrades.upgradeProxy(polygonZkEVMContract.target, PolygonRollupManagerFactoryV1toV2, {
constructorArgs: [
polygonZkEVMGlobalExitRoot.target,
polTokenContract.target,
polygonZkEVMBridgeContract.target,
],
unsafeAllow: ["constructor", "state-variable-immutable"],
- unsafeAllowRenames: false,
+ unsafeAllowRenames: true,
call: {
fn: "initialize",
args: [
@@ -243,23 +246,43 @@ describe("Polygon Rollup manager upgraded", () => {
],
},
});
- });
- it("Cannot initialzie again", async () => {
- await expect(
- rollupManagerContract.initialize(
- trustedAggregator.address,
- pendingStateTimeoutDefault,
- trustedAggregatorTimeout,
- admin.address,
- timelock.address,
- emergencyCouncil.address,
- timelock.address,
- verifierContract.target,
- forkID,
- chainID
- )
- ).to.be.revertedWith("Initializable: contract is already initialized");
+ // upgrade from V2 to Banana
+ const txRollupManager2 = await upgrades.upgradeProxy(
+ polygonZkEVMContract.target,
+ PolygonRollupManagerFactoryPrevious,
+ {
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable", "enum-definition", "struct-definition"],
+ unsafeAllowRenames: true,
+ unsafeAllowCustomTypes: true,
+ unsafeSkipStorageCheck: true,
+ }
+ );
+
+ // upgrade Banana to pessimsitic
+ const txRollupManager3 = await upgrades.upgradeProxy(
+ polygonZkEVMContract.target,
+ PolygonRollupManagerFactoryCurrent,
+ {
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable", "enum-definition", "struct-definition"],
+ unsafeAllowRenames: true,
+ unsafeAllowCustomTypes: true,
+ unsafeSkipStorageCheck: true,
+ call: {
+ fn: "initialize"
+ }
+ }
+ );
});
it("should check the initalized parameters", async () => {
@@ -267,9 +290,6 @@ describe("Polygon Rollup manager upgraded", () => {
expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target);
expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target);
- expect(await rollupManagerContract.pendingStateTimeout()).to.be.equal(pendingStateTimeoutDefault);
- expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(trustedAggregatorTimeout);
-
expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1"));
expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10"));
@@ -294,41 +314,11 @@ describe("Polygon Rollup manager upgraded", () => {
expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(
true
);
+
+ expect(await rollupManagerContract.ROLLUP_MANAGER_VERSION()).to.be.equal(latestVersionRollupManager);
});
it("Check admin parameters", async () => {
- expect(await rollupManagerContract.multiplierBatchFee()).to.be.equal(1002);
- await expect(rollupManagerContract.setMultiplierBatchFee(1023)).to.be.revertedWithCustomError(
- rollupManagerContract,
- "AddressDoNotHaveRequiredRole"
- );
- await expect(rollupManagerContract.connect(admin).setMultiplierBatchFee(0)).to.be.revertedWithCustomError(
- rollupManagerContract,
- "InvalidRangeMultiplierBatchFee"
- );
-
- await expect(rollupManagerContract.connect(admin).setMultiplierBatchFee(1020))
- .to.emit(rollupManagerContract, "SetMultiplierBatchFee")
- .withArgs(1020);
-
- expect(await rollupManagerContract.multiplierBatchFee()).to.be.equal(1020);
-
- // verifyBatchTImetarget
- expect(await rollupManagerContract.verifyBatchTimeTarget()).to.be.equal(60 * 30);
-
- await expect(rollupManagerContract.setVerifyBatchTimeTarget(0)).to.be.revertedWithCustomError(
- rollupManagerContract,
- "AddressDoNotHaveRequiredRole"
- );
- await expect(
- rollupManagerContract.connect(admin).setVerifyBatchTimeTarget(60 * 60 * 24 + 1)
- ).to.be.revertedWithCustomError(rollupManagerContract, "InvalidRangeBatchTimeTarget");
-
- await expect(rollupManagerContract.connect(admin).setVerifyBatchTimeTarget(60))
- .to.emit(rollupManagerContract, "SetVerifyBatchTimeTarget")
- .withArgs(60);
- expect(await rollupManagerContract.verifyBatchTimeTarget()).to.be.equal(60);
-
// batch Fee
// verifyBatchTImetarget
expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1"));
@@ -337,11 +327,16 @@ describe("Polygon Rollup manager upgraded", () => {
rollupManagerContract,
"AddressDoNotHaveRequiredRole"
);
+
await expect(rollupManagerContract.connect(admin).setBatchFee(0)).to.be.revertedWithCustomError(
rollupManagerContract,
"BatchFeeOutOfRange"
);
+ await expect(
+ rollupManagerContract.connect(admin).setBatchFee(ethers.parseEther("1001"))
+ ).to.be.revertedWithCustomError(rollupManagerContract, "BatchFeeOutOfRange");
+
await expect(rollupManagerContract.connect(admin).setBatchFee(ethers.parseEther("10")))
.to.emit(rollupManagerContract, "SetBatchFee")
.withArgs(ethers.parseEther("10"));
@@ -354,9 +349,11 @@ describe("Polygon Rollup manager upgraded", () => {
const chainID2 = chainID + 1;
const networkName = "zkevm";
const forkID = 0;
+ const rollupVerifierType = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
+
// Native token will be ether
const gasTokenAddress = ethers.ZeroAddress;
const gasTokenNetwork = 0;
@@ -378,9 +375,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
@@ -393,9 +391,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -404,9 +403,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -416,9 +416,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
@@ -438,9 +439,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
true,
genesisRandom,
+ programVKey,
]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
await snapshot.restore();
@@ -601,11 +603,11 @@ describe("Polygon Rollup manager upgraded", () => {
expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
+ expect(rollupData._legacyLastPendingState).to.be.equal(0);
+ expect(rollupData._legacyLastPendingStateConsolidated).to.be.equal(0);
expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
+ expect(rollupData.rollupVerifierType).to.be.equal(0);
const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
newCreatedRollupID,
@@ -636,20 +638,10 @@ describe("Polygon Rollup manager upgraded", () => {
// Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
let currentLastBatchSequenced = 1;
-
- await expect(
- newZkEVMContract
- .connect(trustedSequencer)
- .sequenceBatches([sequence], currentTime, currentLastBatchSequenced++, trustedSequencer.address)
- ).to.emit(newZkEVMContract, "SequenceBatches");
-
- const lastBlock = await ethers.provider.getBlock("latest");
- const lastBlockHash = lastBlock?.parentHash;
- const lastGlobalExitRootS = await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot();
+ const l1InfoTreeLeafCount = 0;
const height = 32;
const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
- const leafValueJs = calculateGlobalExitRootLeaf(lastGlobalExitRootS, lastBlockHash, lastBlock?.timestamp);
//merkleTreeGLobalExitRoot.add(leafValueJs);
const rootSC = await polygonZkEVMGlobalExitRoot.getRoot();
@@ -665,6 +657,19 @@ describe("Polygon Rollup manager upgraded", () => {
trustedSequencer.address,
ethers.ZeroHash
);
+
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash2,
+ trustedSequencer.address
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
+
// calcualte accINputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
@@ -780,9 +785,7 @@ describe("Polygon Rollup manager upgraded", () => {
)
)
.to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
- .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address)
- .to.emit(polygonZkEVMGlobalExitRoot, "UpdateL1InfoTree")
- .withArgs(ethers.ZeroHash, rootRollups);
+ .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, trustedAggregator.address);
const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
@@ -981,13 +984,6 @@ describe("Polygon Rollup manager upgraded", () => {
} as BatchDataStructEtrog;
const snapshot3 = await takeSnapshot();
- // Sequence Batches
- await expect(
- newZkEVMContract
- .connect(trustedSequencer)
- .sequenceBatches([sequenceForced], currentTime, currentLastBatchSequenced++, trustedSequencer.address)
- ).to.emit(newZkEVMContract, "SequenceBatches");
-
const expectedAccInputHash3 = calculateAccInputHashetrog(
expectedAccInputHash2,
ethers.keccak256(l2txDataForceBatch),
@@ -996,6 +992,20 @@ describe("Polygon Rollup manager upgraded", () => {
trustedSequencer.address,
forcedBlock?.parentHash
);
+
+ // Sequence Batches
+ await expect(
+ newZkEVMContract
+ .connect(trustedSequencer)
+ .sequenceBatches(
+ [sequenceForced],
+ l1InfoTreeLeafCount,
+ currentTime,
+ expectedAccInputHash3,
+ trustedSequencer.address
+ )
+ ).to.emit(newZkEVMContract, "SequenceBatches");
+
// calcualte accINputHash
expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash3);
@@ -1061,955 +1071,12 @@ describe("Polygon Rollup manager upgraded", () => {
.withArgs(deployer.address);
});
- it("should check full flow no trusted aggreagtor", async () => {
- const urlSequencer = "http://zkevm-json-rpc:8123";
- const chainID2 = chainID + 1;
- const networkName = "zkevm";
- const forkID = 0;
- const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
- // Native token will be ether
- const gasTokenAddress = ethers.ZeroAddress;
- const gasTokenNetwork = 0;
-
- // In order to create a new rollup type, create an implementation of the contract
-
- // Create zkEVM implementation
- const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog");
- const PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target
- );
- await PolygonZKEVMV2Contract.waitForDeployment();
-
- // Try to add a new rollup type
- await expect(
- rollupManagerContract.addNewRollupType(
- PolygonZKEVMV2Contract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- genesisRandom,
- descirption
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
-
- // Add a new rollup type with timelock
- const newRollupTypeID = 1;
- await expect(
- rollupManagerContract
- .connect(timelock)
- .addNewRollupType(
- PolygonZKEVMV2Contract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- genesisRandom,
- descirption
- )
- )
- .to.emit(rollupManagerContract, "AddNewRollupType")
- .withArgs(
- newRollupTypeID,
- PolygonZKEVMV2Contract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- genesisRandom,
- descirption
- );
-
- // assert new rollup type
- const createdRollupType = await rollupManagerContract.rollupTypeMap(newRollupTypeID);
-
- const expectedRollupType = [
- PolygonZKEVMV2Contract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- false,
- genesisRandom,
- ];
- expect(createdRollupType).to.be.deep.equal(expectedRollupType);
-
- // obsoleteRollupType, take snapshot for it
- const snapshot = await takeSnapshot();
-
- await expect(rollupManagerContract.obsoleteRollupType(newRollupTypeID)).to.be.revertedWithCustomError(
- rollupManagerContract,
- "AddressDoNotHaveRequiredRole"
- );
-
- await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID))
- .to.emit(rollupManagerContract, "ObsoleteRollupType")
- .withArgs(newRollupTypeID);
-
- expect([
- PolygonZKEVMV2Contract.target,
- verifierContract.target,
- forkID,
- rollupCompatibilityID,
- true,
- genesisRandom,
- ]).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
- await snapshot.restore();
-
- expect(expectedRollupType).to.be.deep.equal(await rollupManagerContract.rollupTypeMap(newRollupTypeID));
- // Create a
-
- // Only admin can create new zkEVMs
- await expect(
- rollupManagerContract.createNewRollup(
- newRollupTypeID,
- chainID2,
- admin.address,
- trustedSequencer.address,
- gasTokenAddress,
- urlSequencer,
- networkName
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
-
- // UNexisting rollupType
- await expect(
- rollupManagerContract
- .connect(admin)
- .createNewRollup(
- 0,
- chainID2,
- admin.address,
- trustedSequencer.address,
- gasTokenAddress,
- urlSequencer,
- networkName
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeDoesNotExist");
-
- // Obsolete rollup type and test that fails
- const snapshot2 = await takeSnapshot();
- await expect(rollupManagerContract.connect(admin).obsoleteRollupType(newRollupTypeID))
- .to.emit(rollupManagerContract, "ObsoleteRollupType")
- .withArgs(newRollupTypeID);
-
- await expect(
- rollupManagerContract
- .connect(admin)
- .createNewRollup(
- newRollupTypeID,
- chainID2,
- admin.address,
- trustedSequencer.address,
- gasTokenAddress,
- urlSequencer,
- networkName
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "RollupTypeObsolete");
- await snapshot2.restore();
-
- const newCreatedRollupID = 2; // 1 is zkEVM
- const newZKEVMAddress = ethers.getCreateAddress({
- from: rollupManagerContract.target as string,
- nonce: 1,
- });
-
- const newZkEVMContract = PolygonZKEVMV2Factory.attach(newZKEVMAddress) as PolygonZkEVMEtrog;
- const newSequencedBatch = 1;
-
- await expect(
- rollupManagerContract
- .connect(admin)
- .createNewRollup(
- newRollupTypeID,
- chainID2,
- admin.address,
- trustedSequencer.address,
- gasTokenAddress,
- urlSequencer,
- networkName
- )
- )
- .to.emit(rollupManagerContract, "CreateNewRollup")
- .withArgs(newCreatedRollupID, newRollupTypeID, newZKEVMAddress, chainID2, gasTokenAddress)
- .to.emit(newZkEVMContract, "InitialSequenceBatches")
- .to.emit(rollupManagerContract, "OnSequenceBatches")
- .withArgs(newCreatedRollupID, newSequencedBatch);
-
- const blockCreatedRollup = await ethers.provider.getBlock("latest");
-
- // Assert new rollup created
- const timestampCreatedRollup = blockCreatedRollup?.timestamp;
- expect(await newZkEVMContract.admin()).to.be.equal(admin.address);
- expect(await newZkEVMContract.trustedSequencer()).to.be.equal(trustedSequencer.address);
- expect(await newZkEVMContract.trustedSequencerURL()).to.be.equal(urlSequencer);
- expect(await newZkEVMContract.networkName()).to.be.equal(networkName);
- expect(await newZkEVMContract.forceBatchTimeout()).to.be.equal(FORCE_BATCH_TIMEOUT);
-
- // Cannot create 2 chains with the same chainID2
- await expect(
- rollupManagerContract
- .connect(admin)
- .createNewRollup(
- newRollupTypeID,
- chainID2,
- admin.address,
- trustedSequencer.address,
- gasTokenAddress,
- urlSequencer,
- networkName
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "ChainIDAlreadyExist");
-
- const transaction = await newZkEVMContract.generateInitializeTransaction(
- newCreatedRollupID,
- gasTokenAddress,
- gasTokenNetwork,
- "0x" // empty metadata
- );
-
- // Check transaction
- const bridgeL2Factory = await ethers.getContractFactory("PolygonZkEVMBridgeV2");
- const encodedData = bridgeL2Factory.interface.encodeFunctionData("initialize", [
- newCreatedRollupID,
- gasTokenAddress,
- gasTokenNetwork,
- globalExitRootL2Address,
- ethers.ZeroAddress,
- "0x",
- ]);
-
- const rawTx = processorUtils.customRawTxToRawTx(transaction);
- const tx = ethers.Transaction.from(rawTx);
- const rlpSignData = transaction.slice(0, -(SIGNATURE_BYTES * 2 + EFFECTIVE_PERCENTAGE_BYTES * 2));
- expect(rlpSignData).to.be.equal(tx.unsignedSerialized);
-
- expect(tx.to).to.be.equal(polygonZkEVMBridgeContract.target);
- expect(tx.value).to.be.equal(0);
- expect(tx.data).to.be.equal(encodedData);
- expect(tx.gasPrice).to.be.equal(0);
- expect(tx.gasLimit).to.be.equal(30000000);
- expect(tx.nonce).to.be.equal(0);
- expect(tx.chainId).to.be.equal(0);
-
- const expectedAccInputHash = calculateAccInputHashetrog(
- ethers.ZeroHash,
- ethers.keccak256(transaction),
- await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(),
- timestampCreatedRollup,
- trustedSequencer.address,
- blockCreatedRollup?.parentHash
- );
- // calcualte accINputHash
- expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash);
-
- // Check mapping on rollup Manager
- const rollupData = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupData.rollupContract).to.be.equal(newZKEVMAddress);
- expect(rollupData.chainID).to.be.equal(chainID2);
- expect(rollupData.verifier).to.be.equal(verifierContract.target);
- expect(rollupData.forkID).to.be.equal(forkID);
- expect(rollupData.lastLocalExitRoot).to.be.equal(ethers.ZeroHash);
- expect(rollupData.lastBatchSequenced).to.be.equal(newSequencedBatch);
- expect(rollupData.lastVerifiedBatch).to.be.equal(0);
- expect(rollupData.lastPendingState).to.be.equal(0);
- expect(rollupData.lastPendingStateConsolidated).to.be.equal(0);
- expect(rollupData.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
- expect(rollupData.rollupTypeID).to.be.equal(1);
- expect(rollupData.rollupCompatibilityID).to.be.equal(0);
-
- const sequencedBatchData = await rollupManagerContract.getRollupSequencedBatches(
- newCreatedRollupID,
- newSequencedBatch
- );
-
- expect(sequencedBatchData.accInputHash).to.be.equal(expectedAccInputHash);
- expect(sequencedBatchData.sequencedTimestamp).to.be.equal(timestampCreatedRollup);
- expect(sequencedBatchData.previousLastBatchSequenced).to.be.equal(0);
-
- // try verify batches
- const l2txData = "0x123456";
- const maticAmount = await rollupManagerContract.getBatchFee();
- const currentTimestamp = (await ethers.provider.getBlock("latest"))?.timestamp;
-
- const sequence = {
- transactions: l2txData,
- forcedGlobalExitRoot: ethers.ZeroHash,
- forcedTimestamp: 0,
- forcedBlockHashL1: ethers.ZeroHash,
- } as BatchDataStructEtrog;
-
- // Approve tokens
- await expect(polTokenContract.connect(trustedSequencer).approve(newZkEVMContract.target, maticAmount)).to.emit(
- polTokenContract,
- "Approval"
- );
-
- // Sequence Batches
- const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- const currentLastBatchSequenced = 1;
-
- await expect(
- newZkEVMContract
- .connect(trustedSequencer)
- .sequenceBatches([sequence], currentTime, currentLastBatchSequenced, trustedSequencer.address)
- ).to.emit(newZkEVMContract, "SequenceBatches");
-
- const sequencedBatchData2 = await rollupManagerContract.getRollupSequencedBatches(newCreatedRollupID, 2);
-
- const currnetRollup = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(currnetRollup.lastBatchSequenced).to.be.equal(2);
-
- const lastBlock = await ethers.provider.getBlock("latest");
- const height = 32;
-
- const merkleTreeGLobalExitRoot = new MerkleTreeBridge(height);
-
- const rootSC = await polygonZkEVMGlobalExitRoot.getRoot();
- const rootJS = merkleTreeGLobalExitRoot.getRoot();
-
- expect(rootSC).to.be.equal(rootJS);
-
- const expectedAccInputHash2 = calculateAccInputHashetrog(
- expectedAccInputHash,
- ethers.keccak256(l2txData),
- rootSC,
- currentTime,
- trustedSequencer.address,
- ethers.ZeroHash
- );
- // calcualte accINputHash
- expect(await newZkEVMContract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
-
- // Create a new local exit root mocking some bridge
- const tokenName = "Matic Token";
- const tokenSymbol = "MATIC";
- const decimals = 18;
- const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
- ["string", "string", "uint8"],
- [tokenName, tokenSymbol, decimals]
- );
-
- const originNetwork = networkIDRollup;
- const tokenAddress = ethers.getAddress(ethers.hexlify(ethers.randomBytes(20)));
- const amount = ethers.parseEther("10");
- const destinationNetwork = networkIDMainnet;
- const destinationAddress = beneficiary.address;
- const metadata = metadataToken; // since we are inserting in the exit root can be anything
- const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
-
- // compute root merkle tree in Js
- const merkleTreezkEVM = new MerkleTreeBridge(height);
- const leafValue = getLeafValue(
- LEAF_TYPE_ASSET,
- originNetwork,
- tokenAddress,
- destinationNetwork,
- destinationAddress,
- amount,
- metadataHash
- );
-
- // Add 2 leafs
- merkleTreezkEVM.add(leafValue);
- merkleTreezkEVM.add(leafValue);
-
- // check merkle root with SC
- const rootzkEVM = merkleTreezkEVM.getRoot();
-
- // trustedAggregator forge the batch
- const pendingState = 0;
- const newLocalExitRoot = rootzkEVM;
- const newStateRoot = "0x0000000000000000000000000000000000000000000000000000000000000123";
- const newVerifiedBatch = newSequencedBatch;
- const zkProofFFlonk = new Array(24).fill(ethers.ZeroHash);
- const currentVerifiedBatch = 0;
-
- const initialAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
-
- await expect(
- rollupManagerContract.getInputSnarkBytes(
- newCreatedRollupID,
- 3,
- 4,
- newLocalExitRoot,
- ethers.ZeroHash,
- newStateRoot
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "OldAccInputHashDoesNotExist");
-
- await expect(
- rollupManagerContract.getInputSnarkBytes(
- newCreatedRollupID,
- 2,
- 3,
- newLocalExitRoot,
- ethers.ZeroHash,
- newStateRoot
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatches(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "TrustedAggregatorTimeoutNotExpired");
-
- await rollupManagerContract.connect(admin).setTrustedAggregatorTimeout(0);
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatches(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- currentVerifiedBatch + _MAX_VERIFY_BATCHES + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "ExceedMaxVerifyBatches");
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatches(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- currentVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch");
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- 3,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "NewAccInputHashDoesNotExist");
-
- // Calcualte new globalExitroot
- const merkleTreeRollups = new MerkleTreeBridge(height);
- merkleTreeRollups.add(ethers.ZeroHash);
- merkleTreeRollups.add(newLocalExitRoot);
- const rootRollups = merkleTreeRollups.getRoot();
-
- // Verify batch
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "VerifyBatches")
- .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, deployer.address);
-
- const timestampVerifyBatches = (await ethers.provider.getBlock("latest"))?.timestamp;
- const finalAggregatorMatic = await polTokenContract.balanceOf(beneficiary.address);
- expect(finalAggregatorMatic).to.equal(((initialAggregatorMatic + maticAmount) * 1n) / 3n);
- const createdPendingState = 1;
-
- const snapshotVerify = await takeSnapshot();
- await rollupManagerContract.connect(admin).setPendingStateTimeout(0);
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- 0,
- 5,
- 6,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "OldStateRootDoesNotExist");
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- 0,
- newVerifiedBatch,
- 0,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.reverted;
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- createdPendingState + 1,
- currentVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateDoesNotExist");
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- createdPendingState,
- currentVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "InitNumBatchDoesNotMatchPendingState");
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- createdPendingState,
- newVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- ethers.toQuantity(ethers.MaxUint256),
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "NewStateRootNotInsidePrime");
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- createdPendingState,
- newVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "VerifyBatches")
- .withArgs(newCreatedRollupID, newVerifiedBatch + 1, newStateRoot, newLocalExitRoot, deployer.address);
-
- let rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot);
- expect(rollupDataV.lastBatchSequenced).to.be.equal(2);
- expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch + 1);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0);
- expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- newCreatedRollupID,
- 0,
- 0,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchBelowLastVerifiedBatch");
-
- await snapshotVerify.restore();
- await rollupManagerContract.connect(admin).setPendingStateTimeout(1);
-
- await expect(
- rollupManagerContract.verifyBatches(
- newCreatedRollupID,
- createdPendingState,
- newVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "VerifyBatches")
- .withArgs(newCreatedRollupID, newVerifiedBatch + 1, newStateRoot, newLocalExitRoot, deployer.address);
-
- rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupDataV.lastPendingState).to.be.equal(2);
- expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot);
- expect(rollupDataV.lastBatchSequenced).to.be.equal(2);
- expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch);
- expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(1);
- expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
-
- await snapshotVerify.restore();
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .verifyBatchesTrustedAggregator(
- newCreatedRollupID,
- pendingState,
- currentVerifiedBatch,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- newStateRoot,
- beneficiary.address,
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
- .withArgs(
- newCreatedRollupID,
- newVerifiedBatch + 1,
- newStateRoot,
- newLocalExitRoot,
- trustedAggregator.address
- );
-
- rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastLocalExitRoot).to.be.equal(newLocalExitRoot);
- expect(rollupDataV.lastBatchSequenced).to.be.equal(2);
- expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch + 1);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0);
- expect(rollupDataV.lastVerifiedBatchBeforeUpgrade).to.be.equal(0);
-
- await snapshotVerify.restore();
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- 0,
- createdPendingState,
- 0,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "StoredRootMustBeDifferentThanNewRoot");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- 0,
- createdPendingState,
- 5,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "OldStateRootDoesNotExist");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- 3, // init pending state
- 2,
- 0,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateDoesNotExist");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- createdPendingState,
- createdPendingState,
- 0,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "InitNumBatchDoesNotMatchPendingState");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- createdPendingState,
- createdPendingState,
- newVerifiedBatch,
- newVerifiedBatch,
- newLocalExitRoot,
- newStateRoot,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "FinalPendingStateNumInvalid");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- 0,
- createdPendingState,
- 0,
- newVerifiedBatch + 1,
- newLocalExitRoot,
- ethers.ZeroHash,
- zkProofFFlonk
- )
- ).to.be.revertedWithCustomError(rollupManagerContract, "FinalNumBatchDoesNotMatchPendingState");
-
- await expect(
- rollupManagerContract.proveNonDeterministicPendingState(
- newCreatedRollupID,
- 0,
- createdPendingState,
- 0,
- newVerifiedBatch,
- newLocalExitRoot,
- ethers.ZeroHash,
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "ProveNonDeterministicPendingState")
- .withArgs(newStateRoot, ethers.ZeroHash);
-
- expect(await rollupManagerContract.isEmergencyState()).to.be.equal(true);
-
- await snapshotVerify.restore();
-
- const randomSTateRoot = ethers.hexlify(ethers.randomBytes(32));
- const randomlocalRoot = ethers.hexlify(ethers.randomBytes(32));
-
- await expect(
- rollupManagerContract.connect(trustedAggregator).overridePendingState(
- newCreatedRollupID,
- 0,
- createdPendingState,
- 0,
- newVerifiedBatch,
- randomlocalRoot, // local exit root
- randomSTateRoot, // state root
- zkProofFFlonk
- )
- )
- .to.emit(rollupManagerContract, "OverridePendingState")
- .withArgs(
- newCreatedRollupID,
- newVerifiedBatch,
- randomSTateRoot,
- randomlocalRoot,
- trustedAggregator.address
- );
-
- expect(
- await rollupManagerContract.getRollupBatchNumToStateRoot(newCreatedRollupID, newVerifiedBatch)
- ).to.be.equal(randomSTateRoot);
-
- rollupDataV = await rollupManagerContract.rollupIDToRollupData(newCreatedRollupID);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastLocalExitRoot).to.be.equal(randomlocalRoot);
- expect(rollupDataV.lastBatchSequenced).to.be.equal(2);
- expect(rollupDataV.lastVerifiedBatch).to.be.equal(newVerifiedBatch);
- expect(rollupDataV.lastPendingState).to.be.equal(0);
- expect(rollupDataV.lastPendingStateConsolidated).to.be.equal(0);
-
- expect(await rollupManagerContract.isEmergencyState()).to.be.equal(false);
- expect(await rollupManagerContract.trustedAggregatorTimeout()).to.be.equal(_HALT_AGGREGATION_TIMEOUT);
-
- await snapshotVerify.restore();
-
- const pendingStateNum = 1;
- // check revert reasons:
-
- expect(
- await rollupManagerContract.isPendingStateConsolidable(newCreatedRollupID, createdPendingState)
- ).to.be.equal(false);
-
- const currentPendingStateTransition = await rollupManagerContract.getRollupPendingStateTransitions(
- newCreatedRollupID,
- createdPendingState
- );
-
- expect(currentPendingStateTransition.timestamp).to.be.equal(timestampVerifyBatches);
- expect(currentPendingStateTransition.lastVerifiedBatch).to.be.equal(newVerifiedBatch);
- expect(currentPendingStateTransition.exitRoot).to.be.equal(newLocalExitRoot);
- expect(currentPendingStateTransition.stateRoot).to.be.equal(newStateRoot);
-
- await expect(
- rollupManagerContract.consolidatePendingState(newCreatedRollupID, pendingStateNum)
- ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateNotConsolidable");
-
- // try emergency
- await rollupManagerContract.connect(emergencyCouncil).activateEmergencyState();
- await rollupManagerContract.connect(admin).setPendingStateTimeout(0);
-
- await expect(
- rollupManagerContract.consolidatePendingState(newCreatedRollupID, pendingStateNum)
- ).to.be.revertedWithCustomError(rollupManagerContract, "OnlyNotEmergencyState");
- await snapshotVerify.restore();
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .consolidatePendingState(newCreatedRollupID, pendingStateNum + 1)
- ).to.be.revertedWithCustomError(rollupManagerContract, "PendingStateInvalid");
-
- await expect(
- rollupManagerContract
- .connect(trustedAggregator)
- .consolidatePendingState(newCreatedRollupID, pendingStateNum)
- )
- .to.emit(rollupManagerContract, "ConsolidatePendingState")
- .withArgs(newCreatedRollupID, newVerifiedBatch, newStateRoot, newLocalExitRoot, pendingStateNum);
-
- // Assert new root
- expect(
- await rollupManagerContract.getRollupBatchNumToStateRoot(newCreatedRollupID, newVerifiedBatch)
- ).to.be.equal(newStateRoot);
-
- // Assert global exit root
- expect(await polygonZkEVMGlobalExitRoot.lastRollupExitRoot()).to.be.equal(rootRollups);
- expect(await polygonZkEVMGlobalExitRoot.lastMainnetExitRoot()).to.be.equal(ethers.ZeroHash);
-
- expect(await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot()).to.be.equal(
- calculateGlobalExitRoot(ethers.ZeroHash, rootRollups)
- );
-
- const indexLeaf = 0;
- const indexRollup = 1;
- const proofZkEVM = merkleTreezkEVM.getProofTreeByIndex(indexLeaf);
- const proofRollups = merkleTreeRollups.getProofTreeByIndex(indexRollup);
-
- // verify merkle proof
- expect(verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)).to.be.equal(true);
- expect(verifyMerkleProof(rootzkEVM, proofRollups, indexRollup, rootRollups)).to.be.equal(true);
-
- expect(
- await polygonZkEVMBridgeContract.verifyMerkleProof(leafValue, proofZkEVM, indexLeaf, rootzkEVM)
- ).to.be.equal(true);
-
- expect(
- await polygonZkEVMBridgeContract.verifyMerkleProof(newLocalExitRoot, proofRollups, indexRollup, rootRollups)
- ).to.be.equal(true);
-
- // claim
- const tokenWrappedFactory = await ethers.getContractFactory("TokenWrapped");
- // create2 parameters
- const salt = ethers.solidityPackedKeccak256(["uint32", "address"], [networkIDRollup, tokenAddress]);
- const minimalBytecodeProxy = await polygonZkEVMBridgeContract.BASE_INIT_BYTECODE_WRAPPED_TOKEN();
- const hashInitCode = ethers.solidityPackedKeccak256(["bytes", "bytes"], [minimalBytecodeProxy, metadataToken]);
- const precalculateWrappedErc20 = await ethers.getCreate2Address(
- polygonZkEVMBridgeContract.target as string,
- salt,
- hashInitCode
- );
- const newWrappedToken = tokenWrappedFactory.attach(precalculateWrappedErc20) as TokenWrapped;
-
- // Use precalculatedWrapperAddress and check if matches
- expect(
- await polygonZkEVMBridgeContract.precalculatedWrapperAddress(
- networkIDRollup,
- tokenAddress,
- tokenName,
- tokenSymbol,
- decimals
- )
- ).to.be.equal(precalculateWrappedErc20);
-
- // index leaf is 0 bc, does not have mainnet flag, and it's rollup 0 on leaf 0
- const globalIndex = computeGlobalIndex(indexLeaf, indexRollup, false);
- await expect(
- polygonZkEVMBridgeContract.claimAsset(
- proofZkEVM,
- proofRollups,
- globalIndex,
- ethers.ZeroHash,
- rootRollups,
- originNetwork,
- tokenAddress,
- destinationNetwork,
- destinationAddress,
- amount,
- metadata
- )
- )
- .to.emit(polygonZkEVMBridgeContract, "ClaimEvent")
- .withArgs(globalIndex, originNetwork, tokenAddress, destinationAddress, amount)
- .to.emit(polygonZkEVMBridgeContract, "NewWrappedToken")
- .withArgs(originNetwork, tokenAddress, precalculateWrappedErc20, metadata)
- .to.emit(newWrappedToken, "Transfer")
- .withArgs(ethers.ZeroAddress, beneficiary.address, amount);
-
- // Assert maps created
- const newTokenInfo = await polygonZkEVMBridgeContract.wrappedTokenToTokenInfo(precalculateWrappedErc20);
-
- expect(newTokenInfo.originNetwork).to.be.equal(networkIDRollup);
- expect(newTokenInfo.originTokenAddress).to.be.equal(tokenAddress);
- expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
- precalculateWrappedErc20
- );
- expect(await polygonZkEVMBridgeContract.getTokenWrappedAddress(networkIDRollup, tokenAddress)).to.be.equal(
- precalculateWrappedErc20
- );
-
- expect(await polygonZkEVMBridgeContract.tokenInfoToWrappedToken(salt)).to.be.equal(precalculateWrappedErc20);
-
- // Check the wrapper info
- expect(await newWrappedToken.name()).to.be.equal(tokenName);
- expect(await newWrappedToken.symbol()).to.be.equal(tokenSymbol);
- expect(await newWrappedToken.decimals()).to.be.equal(decimals);
-
- // Can't claim because nullifier
- await expect(
- polygonZkEVMBridgeContract.claimAsset(
- proofZkEVM,
- proofRollups,
- globalIndex,
- ethers.ZeroHash,
- rootRollups,
- originNetwork,
- tokenAddress,
- destinationNetwork,
- destinationAddress,
- amount,
- metadata
- )
- ).to.be.revertedWithCustomError(polygonZkEVMBridgeContract, "AlreadyClaimed");
-
- // Check new token
- expect(await newWrappedToken.totalSupply()).to.be.equal(amount);
- });
-
it("Should test obsolete rollup", async () => {
const forkID = 0;
const genesisRandom = "0x0000000000000000000000000000000000000000000000000000000000000001";
- const rollupCompatibilityID = 0;
- const descirption = "zkevm test";
+ const rollupVerifierType = 0;
+ const description = "zkevm test";
+ const programVKey = "0x0000000000000000000000000000000000000000000000000000000000000000";
// In order to create a new rollup type, create an implementation of the contract
@@ -2032,9 +1099,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
)
)
.to.emit(rollupManagerContract, "AddNewRollupType")
@@ -2043,9 +1111,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
genesisRandom,
- descirption
+ description,
+ programVKey
);
// assert new rollup type
@@ -2055,9 +1124,10 @@ describe("Polygon Rollup manager upgraded", () => {
PolygonZKEVMV2Contract.target,
verifierContract.target,
forkID,
- rollupCompatibilityID,
+ rollupVerifierType,
false,
genesisRandom,
+ programVKey,
];
expect(createdRollupType).to.be.deep.equal(expectedRollupType);
diff --git a/test/contractsv2/PolygonValidiumEtrog.test.ts b/test/contractsv2/PolygonValidiumEtrog.test.ts
index fe4f8a7c5..ca1c8816b 100644
--- a/test/contractsv2/PolygonValidiumEtrog.test.ts
+++ b/test/contractsv2/PolygonValidiumEtrog.test.ts
@@ -29,7 +29,7 @@ function calculateGlobalExitRoot(mainnetExitRoot: any, rollupExitRoot: any) {
return ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [mainnetExitRoot, rollupExitRoot]);
}
-describe("PolygonZkEVMEtrog", () => {
+describe("PolygonValidiumEtrog", () => {
let deployer: any;
let timelock: any;
let emergencyCouncil: any;
@@ -129,7 +129,6 @@ describe("PolygonZkEVMEtrog", () => {
// deploy globalExitRoot
const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
- initializer: false,
constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress],
unsafeAllow: ["constructor", "state-variable-immutable"],
});
@@ -167,12 +166,17 @@ describe("PolygonZkEVMEtrog", () => {
// deploy consensus
// Create zkEVM implementation
const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonValidiumEtrog");
- PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target
- );
+ PolygonZKEVMV2Contract = await upgrades.deployProxy(PolygonZKEVMV2Factory, [], {
+ initializer: false,
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
await PolygonZKEVMV2Contract.waitForDeployment();
// Create CdkCommitee
@@ -579,13 +583,13 @@ describe("PolygonZkEVMEtrog", () => {
).to.emit(polTokenContract, "Approval");
// Sequence Batches
- const currentLastBatchSequenced = 1;
-
+ const l1InfoTreeLeafCount = 0; // No bridges in sequence
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
0,
- currentLastBatchSequenced,
+ l1InfoTreeLeafCount,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceWithDataAvailabilityNotAllowed");
@@ -602,8 +606,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime + 38,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "MaxTimestampSequenceInvalid");
@@ -611,8 +616,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyTrustedSequencer");
@@ -620,8 +626,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceZeroBatches");
@@ -636,8 +643,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
hugeBatchArray,
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches");
@@ -653,8 +661,9 @@ describe("PolygonZkEVMEtrog", () => {
forcedBlockHashL1: ethers.ZeroHash,
},
],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax");
@@ -670,32 +679,33 @@ describe("PolygonZkEVMEtrog", () => {
forcedBlockHashL1: ethers.ZeroHash,
},
],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForcedDataDoesNotMatch");
+ const expectedAccInputHash2 = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.getRoot(),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash2,
trustedSequencer.address
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp;
- const expectedAccInputHash2 = calculateAccInputHashetrog(
- expectedAccInputHash,
- ethers.keccak256(l2txData),
- await polygonZkEVMGlobalExitRoot.getRoot(),
- currentTime,
- trustedSequencer.address,
- ethers.ZeroHash
- );
-
// calcualte accINputHash
expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
});
@@ -786,12 +796,13 @@ describe("PolygonZkEVMEtrog", () => {
// Sequence Batches
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- let currentLastBatchSequenced = 1;
+ const l1InfoTreeLeafCount = 0;
await expect(
PolygonZKEVMV2Contract.sequenceBatchesValidium(
[sequenceValidium],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
"0x1233"
)
@@ -800,8 +811,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
"0x1233"
)
@@ -817,8 +829,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
hugeBatchArray,
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
"0x"
)
@@ -835,8 +848,9 @@ describe("PolygonZkEVMEtrog", () => {
forcedBlockHashL1: ethers.ZeroHash,
},
],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
"0x"
)
@@ -845,8 +859,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[sequenceValidium],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
"0x1233"
)
@@ -882,8 +897,16 @@ describe("PolygonZkEVMEtrog", () => {
addrBytes = addrBytes + walletsDataCommitee[i].address.slice(2);
}
+ const expectedAccInputHash2 = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ hashedData,
+ await polygonZkEVMGlobalExitRoot.getRoot(),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
const commiteeHash = ethers.keccak256(addrBytes);
- const signedData = ethers.solidityPackedKeccak256(["bytes32", "bytes32"], [ethers.ZeroHash, hashedData]);
+ const signedData = expectedAccInputHash2;
let message = "0x";
for (let i = 0; i < walletsDataCommitee.length; i++) {
const newSignature = walletsDataCommitee[i].signingKey.sign(signedData);
@@ -898,8 +921,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[sequenceValidium],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
badDataAvMessage
)
@@ -908,8 +932,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[sequenceValidium],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address,
badDataAvMessage.slice(0, -2)
)
@@ -918,23 +943,15 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[sequenceValidium],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash2,
trustedSequencer.address,
dataAvailabilityMessage
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
- const expectedAccInputHash2 = calculateAccInputHashetrog(
- expectedAccInputHash,
- hashedData,
- await polygonZkEVMGlobalExitRoot.getRoot(),
- currentTime,
- trustedSequencer.address,
- ethers.ZeroHash
- );
-
- // calcualte accINputHash
+ // calculate accINputHash
expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
});
@@ -1305,12 +1322,21 @@ describe("PolygonZkEVMEtrog", () => {
.withArgs(commiteeHash);
const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- const currentLastBatchSequenced = 1;
+ const l1InfoTreeLeafCount = 0;
+ const expectedAccInputHash2 = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(),
+ timestampForceBatch,
+ trustedSequencer.address,
+ blockForced?.parentHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatchesValidium(
[sequenceForced],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash2,
trustedSequencer.address,
"0x12"
)
diff --git a/test/contractsv2/PolygonZkEVMEtrog.test.ts b/test/contractsv2/PolygonZkEVMEtrog.test.ts
index c677b8d9e..1de6965e7 100644
--- a/test/contractsv2/PolygonZkEVMEtrog.test.ts
+++ b/test/contractsv2/PolygonZkEVMEtrog.test.ts
@@ -126,7 +126,6 @@ describe("PolygonZkEVMEtrog", () => {
// deploy globalExitRoot
const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2");
polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
- initializer: false,
constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress],
unsafeAllow: ["constructor", "state-variable-immutable"],
});
@@ -164,12 +163,17 @@ describe("PolygonZkEVMEtrog", () => {
// deploy consensus
// Create zkEVM implementation
const PolygonZKEVMV2Factory = await ethers.getContractFactory("PolygonZkEVMEtrog");
- PolygonZKEVMV2Contract = await PolygonZKEVMV2Factory.deploy(
- polygonZkEVMGlobalExitRoot.target,
- polTokenContract.target,
- polygonZkEVMBridgeContract.target,
- rollupManagerContract.target
- );
+ PolygonZKEVMV2Contract = await upgrades.deployProxy(PolygonZKEVMV2Factory, [], {
+ initializer: false,
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
await PolygonZKEVMV2Contract.waitForDeployment();
});
@@ -383,7 +387,8 @@ describe("PolygonZkEVMEtrog", () => {
expect(tx.nonce).to.be.equal(0);
expect(tx.chainId).to.be.equal(0);
- const expectedAccInputHash = calculateAccInputHashetrog(
+ // calculate accINputHash
+ const initExpectedAccInputHash = calculateAccInputHashetrog(
ethers.ZeroHash,
ethers.keccak256(transaction),
await polygonZkEVMGlobalExitRoot.getLastGlobalExitRoot(),
@@ -391,9 +396,7 @@ describe("PolygonZkEVMEtrog", () => {
trustedSequencer.address,
blockCreatedRollup?.parentHash
);
-
- // calcualte accINputHash
- expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash);
+ expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(initExpectedAccInputHash);
// try verify batches
const l2txData = "0x123456";
@@ -412,14 +415,74 @@ describe("PolygonZkEVMEtrog", () => {
).to.emit(polTokenContract, "Approval");
// Sequence Batches
- const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
- let currentLastBatchSequenced = 1;
+ const l1InfoTreeLeafCount = 1;
+ // Do one bridge to have first leaf of l1InfoTree with value
+ const depositCount = await polygonZkEVMBridgeContract.depositCount();
+ const originNetwork = networkIDMainnet;
+ const originAddress = deployer.address;
+ const amount = ethers.parseEther("10");
+ const destinationNetwork = networkIDRollup;
+ const destinationAddress = deployer.address;
+ const tokenName = "Matic Token";
+ const tokenSymbol = "MATIC";
+ const decimals = 18;
+ const metadataToken = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["string", "string", "uint8"],
+ [tokenName, tokenSymbol, decimals]
+ );
+ const metadata = metadataToken;
+ const metadataHash = ethers.solidityPackedKeccak256(["bytes"], [metadata]);
+
+ // create a new deposit
+ await expect(polTokenContract.approve(polygonZkEVMBridgeContract.target, amount))
+ .to.emit(polTokenContract, "Approval")
+ .withArgs(deployer.address, polygonZkEVMBridgeContract.target, amount);
+
+ // pre compute root merkle tree in Js
+ const height = 32;
+ const merkleTree = new MerkleTreeBridge(height);
+ const leafValue = getLeafValue(
+ LEAF_TYPE_ASSET,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadataHash
+ );
+ merkleTree.add(leafValue);
+ await expect(
+ polygonZkEVMBridgeContract.bridgeMessage(destinationNetwork, destinationAddress, true, metadata, {
+ value: amount,
+ })
+ )
+ .to.emit(polygonZkEVMBridgeContract, "BridgeEvent")
+ .withArgs(
+ LEAF_TYPE_MESSAGE,
+ originNetwork,
+ originAddress,
+ destinationNetwork,
+ destinationAddress,
+ amount,
+ metadata,
+ depositCount
+ );
+ const currentTime = Number((await ethers.provider.getBlock("latest"))?.timestamp);
+ const expectedAccInputHash = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.getRoot(),
+ currentTime + 10,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime + 38,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "MaxTimestampSequenceInvalid");
@@ -427,17 +490,29 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ 5,
currentTime + 10,
- currentLastBatchSequenced + 1,
+ expectedAccInputHash,
trustedSequencer.address
)
- ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "InitSequencedBatchDoesNotMatch");
+ ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "L1InfoTreeLeafCountInvalid");
+
+ await expect(
+ PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
+ [sequence],
+ l1InfoTreeLeafCount,
+ currentTime + 10,
+ ethers.keccak256(ethers.ZeroHash), // Random expectedAccInputHash
+ trustedSequencer.address
+ )
+ ).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "FinalAccInputHashDoesNotMatch");
await expect(
PolygonZKEVMV2Contract.sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "OnlyTrustedSequencer");
@@ -445,8 +520,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "SequenceZeroBatches");
@@ -461,8 +537,9 @@ describe("PolygonZkEVMEtrog", () => {
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
hugeBatchArray,
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ExceedMaxVerifyBatches");
@@ -478,8 +555,9 @@ describe("PolygonZkEVMEtrog", () => {
forcedBlockHashL1: ethers.ZeroHash,
},
],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "TransactionsLengthAboveMax");
@@ -495,50 +573,72 @@ describe("PolygonZkEVMEtrog", () => {
forcedBlockHashL1: ethers.ZeroHash,
},
],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash,
trustedSequencer.address
)
).to.be.revertedWithCustomError(PolygonZKEVMV2Contract, "ForcedDataDoesNotMatch");
+ const expectedAccInputHash2 = calculateAccInputHashetrog(
+ await PolygonZKEVMV2Contract.lastAccInputHash(),
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.l1InfoRootMap(l1InfoTreeLeafCount),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced++,
+ expectedAccInputHash2,
trustedSequencer.address
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
- const currentTimestampSequenced = (await ethers.provider.getBlock("latest"))?.timestamp;
-
- const expectedAccInputHash2 = calculateAccInputHashetrog(
- expectedAccInputHash,
- ethers.keccak256(l2txData),
- await polygonZkEVMGlobalExitRoot.getRoot(),
- currentTime,
- trustedSequencer.address,
- ethers.ZeroHash
- );
-
- // calcualte accINputHash
+ // calculate accINputHash
expect(await PolygonZKEVMV2Contract.lastAccInputHash()).to.be.equal(expectedAccInputHash2);
- const sequenceArray = new Array(24).fill(sequence);
+ const txCount = 24;
+ const sequenceArray = new Array(txCount).fill(sequence);
+ let expectedAccInputHash3 = expectedAccInputHash2;
+ for (let i = 0; i < txCount; i++) {
+ expectedAccInputHash3 = calculateAccInputHashetrog(
+ expectedAccInputHash3,
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.l1InfoRootMap(l1InfoTreeLeafCount),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
+ }
+
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
sequenceArray,
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced,
+ expectedAccInputHash3,
trustedSequencer.address
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
+ const expectedAccInputHash4 = calculateAccInputHashetrog(
+ expectedAccInputHash3,
+ ethers.keccak256(l2txData),
+ await polygonZkEVMGlobalExitRoot.l1InfoRootMap(l1InfoTreeLeafCount),
+ currentTime,
+ trustedSequencer.address,
+ ethers.ZeroHash
+ );
await expect(
PolygonZKEVMV2Contract.connect(trustedSequencer).sequenceBatches(
[sequence],
+ l1InfoTreeLeafCount,
currentTime,
- currentLastBatchSequenced + sequenceArray.length,
+ expectedAccInputHash4,
trustedSequencer.address
)
).to.emit(PolygonZKEVMV2Contract, "SequenceBatches");
diff --git a/test/contractsv2/real-prover-sp1/e2e-verify-proof.test.ts b/test/contractsv2/real-prover-sp1/e2e-verify-proof.test.ts
new file mode 100644
index 000000000..076b47243
--- /dev/null
+++ b/test/contractsv2/real-prover-sp1/e2e-verify-proof.test.ts
@@ -0,0 +1,351 @@
+/* eslint-disable no-plusplus, no-await-in-loop */
+import {expect} from "chai";
+import {ethers, upgrades} from "hardhat";
+import {
+ SP1VerifierPlonk,
+ ERC20PermitMock,
+ PolygonRollupManagerMock,
+ PolygonZkEVMGlobalExitRootV2Mock,
+ PolygonZkEVMBridgeV2,
+ PolygonPessimisticConsensus,
+} from "../../../typechain-types";
+const {
+ VerifierType,
+ computeInputPessimisticBytes,
+ computeConsensusHashEcdsa,
+} = require("../../../src/pessimistic-utils");
+const inputProof = require("./test-inputs/input.json");
+
+describe("Polygon Rollup Manager with Polygon Pessimistic Consensus", () => {
+ let deployer: any;
+ let timelock: any;
+ let emergencyCouncil: any;
+ let trustedAggregator: any;
+ let trustedSequencer: any;
+ let admin: any;
+ let beneficiary: any;
+
+ let verifierContract: SP1VerifierPlonk;
+ let polygonZkEVMBridgeContract: PolygonZkEVMBridgeV2;
+ let polTokenContract: ERC20PermitMock;
+ let polygonZkEVMGlobalExitRoot: PolygonZkEVMGlobalExitRootV2Mock;
+ let rollupManagerContract: PolygonRollupManagerMock;
+ let PolygonPPConsensusContract: PolygonPessimisticConsensus;
+
+ const polTokenName = "POL Token";
+ const polTokenSymbol = "POL";
+ const polTokenInitialBalance = ethers.parseEther("20000000");
+
+ const pendingStateTimeoutDefault = 100;
+ const trustedAggregatorTimeout = 100;
+
+ // BRidge constants
+ const networkIDMainnet = 0;
+ const networkIDRollup = 1;
+
+ const LEAF_TYPE_ASSET = 0;
+ const LEAF_TYPE_MESSAGE = 1;
+
+ let firstDeployment = true;
+
+ //roles
+ const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
+ const ADD_ROLLUP_TYPE_ROLE = ethers.id("ADD_ROLLUP_TYPE_ROLE");
+ const OBSOLETE_ROLLUP_TYPE_ROLE = ethers.id("OBSOLETE_ROLLUP_TYPE_ROLE");
+ const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE");
+ const ADD_EXISTING_ROLLUP_ROLE = ethers.id("ADD_EXISTING_ROLLUP_ROLE");
+ const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE");
+ const TRUSTED_AGGREGATOR_ROLE = ethers.id("TRUSTED_AGGREGATOR_ROLE");
+ const TRUSTED_AGGREGATOR_ROLE_ADMIN = ethers.id("TRUSTED_AGGREGATOR_ROLE_ADMIN");
+ const TWEAK_PARAMETERS_ROLE = ethers.id("TWEAK_PARAMETERS_ROLE");
+ const SET_FEE_ROLE = ethers.id("SET_FEE_ROLE");
+ const STOP_EMERGENCY_ROLE = ethers.id("STOP_EMERGENCY_ROLE");
+ const EMERGENCY_COUNCIL_ROLE = ethers.id("EMERGENCY_COUNCIL_ROLE");
+ const EMERGENCY_COUNCIL_ADMIN = ethers.id("EMERGENCY_COUNCIL_ADMIN");
+
+ const SIGNATURE_BYTES = 32 + 32 + 1;
+ const EFFECTIVE_PERCENTAGE_BYTES = 1;
+
+ beforeEach("Deploy contract", async () => {
+ upgrades.silenceWarnings();
+
+ // load signers
+ [deployer, trustedAggregator, admin, timelock, emergencyCouncil, beneficiary] = await ethers.getSigners();
+ trustedSequencer = inputProof.signer;
+ // deploy mock verifier
+ const VerifierRollupHelperFactory = await ethers.getContractFactory("SP1VerifierPlonk");
+ verifierContract = await VerifierRollupHelperFactory.deploy();
+
+ // deploy pol
+ const polTokenFactory = await ethers.getContractFactory("ERC20PermitMock");
+ polTokenContract = await polTokenFactory.deploy(
+ polTokenName,
+ polTokenSymbol,
+ deployer.address,
+ polTokenInitialBalance
+ );
+
+ /*
+ * deploy global exit root manager
+ * In order to not have trouble with nonce deploy first proxy admin
+ */
+ await upgrades.deployProxyAdmin();
+
+ if ((await upgrades.admin.getInstance()).target !== "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") {
+ firstDeployment = false;
+ }
+ const nonceProxyBridge =
+ Number(await ethers.provider.getTransactionCount(deployer.address)) + (firstDeployment ? 3 : 2);
+
+ const nonceProxyZkevm = nonceProxyBridge + 2; // Always have to redeploy impl since the polygonZkEVMGlobalExitRoot address changes
+
+ const precalculateBridgeAddress = ethers.getCreateAddress({
+ from: deployer.address,
+ nonce: nonceProxyBridge,
+ });
+ const precalculateRollupManagerAddress = ethers.getCreateAddress({
+ from: deployer.address,
+ nonce: nonceProxyZkevm,
+ });
+ firstDeployment = false;
+
+ // deploy globalExitRoot
+ const PolygonZkEVMGlobalExitRootFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2Mock");
+ polygonZkEVMGlobalExitRoot = await upgrades.deployProxy(PolygonZkEVMGlobalExitRootFactory, [], {
+ constructorArgs: [precalculateRollupManagerAddress, precalculateBridgeAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
+ // deploy PolygonZkEVMBridge
+ const polygonZkEVMBridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2");
+ polygonZkEVMBridgeContract = await upgrades.deployProxy(polygonZkEVMBridgeFactory, [], {
+ initializer: false,
+ unsafeAllow: ["constructor"],
+ });
+
+ // deploy polygon rollup manager mock
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManagerMock");
+
+ rollupManagerContract = (await upgrades.deployProxy(PolygonRollupManagerFactory, [], {
+ initializer: false,
+ constructorArgs: [
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ ],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ })) as unknown as PolygonRollupManagerMock;
+
+ await rollupManagerContract.waitForDeployment();
+
+ // check precalculated address
+ expect(precalculateBridgeAddress).to.be.equal(polygonZkEVMBridgeContract.target);
+ expect(precalculateRollupManagerAddress).to.be.equal(rollupManagerContract.target);
+
+ await polygonZkEVMBridgeContract.initialize(
+ networkIDMainnet,
+ ethers.ZeroAddress, // zero for ether
+ ethers.ZeroAddress, // zero for ether
+ polygonZkEVMGlobalExitRoot.target,
+ rollupManagerContract.target,
+ "0x"
+ );
+
+ // Initialize Mock
+ await rollupManagerContract.initializeMock(
+ trustedAggregator.address,
+ pendingStateTimeoutDefault,
+ trustedAggregatorTimeout,
+ admin.address,
+ timelock.address,
+ emergencyCouncil.address
+ );
+
+ await expect(rollupManagerContract.initialize()).to.emit(rollupManagerContract, "UpdateRollupManagerVersion");
+
+ // fund sequencer address with Matic tokens
+ await polTokenContract.transfer(trustedSequencer, ethers.parseEther("1000"));
+ });
+
+ it("should check the initalized parameters", async () => {
+ expect(await rollupManagerContract.globalExitRootManager()).to.be.equal(polygonZkEVMGlobalExitRoot.target);
+ expect(await rollupManagerContract.pol()).to.be.equal(polTokenContract.target);
+ expect(await rollupManagerContract.bridgeAddress()).to.be.equal(polygonZkEVMBridgeContract.target);
+
+ expect(await rollupManagerContract.getBatchFee()).to.be.equal(ethers.parseEther("0.1"));
+ expect(await rollupManagerContract.getForcedBatchFee()).to.be.equal(ethers.parseEther("10"));
+ expect(await rollupManagerContract.calculateRewardPerBatch()).to.be.equal(0);
+
+ // Check roles
+ expect(await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(ADD_ROLLUP_TYPE_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, timelock.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(ADD_EXISTING_ROLLUP_ROLE, timelock.address)).to.be.equal(true);
+
+ expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE, trustedAggregator.address)).to.be.equal(
+ true
+ );
+
+ expect(await rollupManagerContract.hasRole(OBSOLETE_ROLLUP_TYPE_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(TRUSTED_AGGREGATOR_ROLE_ADMIN, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(TWEAK_PARAMETERS_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(SET_FEE_ROLE, admin.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(STOP_EMERGENCY_ROLE, admin.address)).to.be.equal(true);
+
+ expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ROLE, emergencyCouncil.address)).to.be.equal(true);
+ expect(await rollupManagerContract.hasRole(EMERGENCY_COUNCIL_ADMIN, emergencyCouncil.address)).to.be.equal(
+ true
+ );
+ });
+
+ it("should verify pessimistic proof: pessimistic type, with a real verifier (not mock)", async () => {
+ // deploy consensus
+ // create polygonPessimisticConsensus implementation
+ const ppConsensusFactory = await ethers.getContractFactory("PolygonPessimisticConsensus");
+ PolygonPPConsensusContract = await ppConsensusFactory.deploy(
+ polygonZkEVMGlobalExitRoot.target,
+ polTokenContract.target,
+ polygonZkEVMBridgeContract.target,
+ rollupManagerContract.target
+ );
+ await PolygonPPConsensusContract.waitForDeployment();
+
+ // Try to add a new rollup type
+ const forkID = 11; // just metadata for pessimistic consensus
+ const genesis = ethers.ZeroHash;
+ const description = "new pessimistic consensus";
+ const programVKey = inputProof.vkey;
+ const rollupTypeID = 1;
+
+ // correct add new rollup via timelock
+ await rollupManagerContract
+ .connect(timelock)
+ .addNewRollupType(
+ PolygonPPConsensusContract.target,
+ verifierContract.target,
+ forkID,
+ VerifierType.Pessimistic,
+ genesis,
+ description,
+ programVKey
+ );
+
+ // create new pessimistic: only admin
+ const chainID = 1;
+ const gasTokenAddress = ethers.ZeroAddress;
+ const urlSequencer = "https://pessimistic:8545";
+ const networkName = "testPessimistic";
+ const pessimisticRollupID = inputProof["pp-inputs"]["origin-network"];
+
+ // create new pessimistic
+ const newZKEVMAddress = ethers.getCreateAddress({
+ from: rollupManagerContract.target as string,
+ nonce: 1,
+ });
+
+ await rollupManagerContract
+ .connect(admin)
+ .createNewRollup(
+ rollupTypeID,
+ chainID,
+ admin.address,
+ trustedSequencer,
+ gasTokenAddress,
+ urlSequencer,
+ networkName
+ );
+
+ // select unexistent global exit root
+ const l1InfoTreeLeafCount = 2;
+ const newLER = inputProof["pp-inputs"]["new-local-exit-root"];
+ const newPPRoot = inputProof["pp-inputs"]["new-pessimistic-root"];
+ const proofPP = inputProof.proof;
+
+ // not trusted aggregator
+ await expect(
+ rollupManagerContract.verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ l1InfoTreeLeafCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "AddressDoNotHaveRequiredRole");
+
+ // global exit root does not exist
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ l1InfoTreeLeafCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ ).to.be.revertedWithCustomError(rollupManagerContract, "L1InfoTreeLeafCountInvalid");
+
+ const l1InfoRoot = inputProof["pp-inputs"]["l1-info-root"];
+ // check JS function computeInputPessimisticBytes
+ const inputPessimisticBytes = await rollupManagerContract.getInputPessimisticBytes(
+ pessimisticRollupID,
+ l1InfoRoot,
+ inputProof["pp-inputs"]["new-local-exit-root"],
+ inputProof["pp-inputs"]["new-pessimistic-root"]
+ );
+
+ const infoRollup = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ const consensusHash = computeConsensusHashEcdsa(trustedSequencer);
+
+ const expectedInputPessimisticBytes = computeInputPessimisticBytes(
+ infoRollup[4],
+ infoRollup[10],
+ l1InfoRoot,
+ pessimisticRollupID,
+ consensusHash,
+ newLER,
+ newPPRoot
+ );
+
+ expect(inputPessimisticBytes).to.be.equal(expectedInputPessimisticBytes);
+ // Mock selected GER
+ await polygonZkEVMGlobalExitRoot.injectGER(l1InfoRoot, l1InfoTreeLeafCount);
+
+ // verify pessimistic
+ await expect(
+ rollupManagerContract
+ .connect(trustedAggregator)
+ .verifyPessimisticTrustedAggregator(
+ pessimisticRollupID,
+ l1InfoTreeLeafCount,
+ newLER,
+ newPPRoot,
+ proofPP
+ )
+ )
+ .to.emit(rollupManagerContract, "VerifyBatchesTrustedAggregator")
+ .withArgs(pessimisticRollupID, 0, ethers.ZeroHash, newLER, trustedAggregator.address);
+
+ // assert rollup data
+ const resRollupData = await rollupManagerContract.rollupIDToRollupDataV2(pessimisticRollupID);
+
+ const expectedRollupData = [
+ newZKEVMAddress,
+ chainID,
+ verifierContract.target,
+ forkID,
+ newLER,
+ 0,
+ 0,
+ 0,
+ rollupTypeID,
+ VerifierType.Pessimistic,
+ newPPRoot,
+ programVKey,
+ ];
+
+ expect(expectedRollupData).to.be.deep.equal(resRollupData);
+ });
+});
diff --git a/test/contractsv2/real-prover-sp1/real-prover-test-inputs.test.ts b/test/contractsv2/real-prover-sp1/real-prover-test-inputs.test.ts
new file mode 100644
index 000000000..5bbf5845d
--- /dev/null
+++ b/test/contractsv2/real-prover-sp1/real-prover-test-inputs.test.ts
@@ -0,0 +1,24 @@
+const { ethers } = require('hardhat');
+
+const input = require('./test-inputs/input.json');
+
+describe('Real prover inputs test', () => {
+ let verifierContract;
+
+ beforeEach('Deploy contract', async () => {
+ // deploy mock verifier
+ const VerifierFactory = await ethers.getContractFactory(
+ 'SP1VerifierPlonk',
+ );
+ verifierContract = await VerifierFactory.deploy();
+ });
+
+ it('Test real prover', async () => {
+ // If the verification fails, it reverts and throws error, else it returns nothing
+ await verifierContract.verifyProof(
+ input.vkey,
+ input['public-values'],
+ input.proof,
+ );
+ });
+});
diff --git a/test/contractsv2/real-prover-sp1/test-inputs/input.json b/test/contractsv2/real-prover-sp1/test-inputs/input.json
new file mode 100644
index 000000000..7926fa674
--- /dev/null
+++ b/test/contractsv2/real-prover-sp1/test-inputs/input.json
@@ -0,0 +1,15 @@
+{
+ "pp-inputs": {
+ "prev-local-exit-root": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "prev-pessimistic-root": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "l1-info-root": "0x9f1d0c7713a6a5f1e79222623c0687242c3feed74ebecb6f9d0e87e7572cdeca",
+ "origin-network": 1,
+ "consensus-hash": "0x999e4fef8b9af84b9cb960e8ec82f8e22265fad3dd91f243151f329b2be822d8",
+ "new-local-exit-root": "0xdc8303b7d6a0efe97628c90caa9b8bd30a451c72b16af6b65c618d33f8d94c9e",
+ "new-pessimistic-root": "0x1178d1e1a7a864774831e9d047573600731bdfc28aaccd663a3a221447e60fb0"
+ },
+ "signer": "0x67f761cd7f8e3fdb3c7bdf7c0bbf76ab3f4fbd2a",
+ "vkey": "0x0062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a512",
+ "public-values": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f1d0c7713a6a5f1e79222623c0687242c3feed74ebecb6f9d0e87e7572cdeca00000001999e4fef8b9af84b9cb960e8ec82f8e22265fad3dd91f243151f329b2be822d8dc8303b7d6a0efe97628c90caa9b8bd30a451c72b16af6b65c618d33f8d94c9e1178d1e1a7a864774831e9d047573600731bdfc28aaccd663a3a221447e60fb0",
+ "proof": "0x1b34fe112a4ada9058510af95e7f5319263677e3551158d405afe37843808235d89b38370199b493d80d5f02dbd607af9f16e387a1065bd689815cb8b66052a1d8fa6e5f0fd906e6dd73ad9ec2841dc10efaaa09da41d38fa9c3d6d48aabea2c27371b730550c7175a3a00d940b6ba0f4d0b7a9b7fa8f04b4b44e26cb5d664e5831cf50f2e25bfa80dd3a6b27093849e5691922180c0d2df9eeae0ffd6c7f9330f36ea2a2c7b1b97e3f839a7b5ceafeb92960d0714ca2bbe2c951d9e91052cb02eb16a7613672b22de3898850d0658a08e7fd33fa63124f173fb5623a019c39eed66f5df17a85d1f7ed35495b2bcdacc560608ff944f410d73adbdf567472678a933ac460c55f17dedbcf2de75ac964fb58f052222d902f8f4a55b79471e9e566ea53ec82d6a005251a8264b3270b6370697293652efcb05e25b703432852400a8b1d4ca1ed512d016e6371c57ac51c6ebba9c629802698b0e4487dec044acd9e08fc3660d5ef2fc130f8facfbe26a97e1bde0f58876d45fce622f228211557488cd3a701fbb03ff74b85e4b6ba9ab76e059d5e17f0e27aada7737f9ad16ed7d880b037424e9df26b900b7f0c7b3c55495e1cb88d1b80e04bd4f8f49fbb6c3edd159da89303068cf1b319332e020be6d7c173e55a3064d38b180174ee3504fdc6be8882612e76b5d0e3037ef856bd81006844250042a8b441ed25ff6a513fd636ec805fb12fdda1b11fed516b00719d9f1c881797e17feca48723fad06ea0e66212e19df139217b56c8e48e83277a0e0a664bbaea9ec02cac9d447536d247c53aa2def050c0996b93060ac0b09b8377784df4f877534ec601352645ad3d206bc5044878f149865264c19f864ccf40c58f94a63996d878baf246ba109d9695afeffefe4c9024d66443ea45c4d1a493e7b4bcaf86e8652513a417ac47c939623a24e6e55e927e14a3ec539c929e288568bb2966627a53de0f0fc480150d7637b8c99d9e42609c9b4dcf66a091c833e436ee61bc6c11d0189016e5790e805c75e710122b15903464a856b27ebe483cdf87d1cd1c9538f90741f9fbe7fc51999b05f6b8d56e229da7125024a6bf51d67eaefa8fc0633394fca33162b611428294bbb7eb00967270c425b9b1ce22b13f298451720424695e902f72383a7f15e0d36181b7db709252307f8da504522eb0854ce89edcb87939539db1e84fea0cba0ef7b903f3972"
+}
\ No newline at end of file
diff --git a/test/src/timelock-storage.test.ts b/test/src/timelock-storage.test.ts
new file mode 100644
index 000000000..7fe6c3f47
--- /dev/null
+++ b/test/src/timelock-storage.test.ts
@@ -0,0 +1,35 @@
+import { expect } from 'chai';
+import { ethers } from 'hardhat';
+import lodash from 'lodash';
+const { initializeTimelockStorage } = require('../../src/genesis/genesis-helpers');
+const { getStorageWrites } = require('../../src/utils');
+
+describe('Timelock storage util', () => {
+ it('Verify genesis util: initializeTimelockStorage', async () => {
+ const minDelay = 3600;
+ const timelockAdminAddress = '0x1234567890123456789012345678901234567890';
+
+ const timelockContractFactory = await ethers.getContractFactory('PolygonZkEVMTimelock');
+ const timelockContract = await timelockContractFactory.deploy(
+ minDelay,
+ [timelockAdminAddress],
+ [timelockAdminAddress],
+ timelockAdminAddress,
+ ethers.ZeroAddress
+ );
+ const tx = await timelockContract.deploymentTransaction();
+
+ const trace = await ethers.provider.send("debug_traceTransaction", [tx.hash, {
+ enableMemory: false,
+ disableStack: false,
+ disableStorage: false,
+ enableReturnData: false,
+ }]);
+
+ // Get utils storage and compare with the one computed
+ const computedTimelockStorage = getStorageWrites(trace);
+ const utilsTimelockStorage = initializeTimelockStorage(minDelay, timelockAdminAddress, timelockContract.target);
+
+ expect(lodash.isEqual(computedTimelockStorage, utilsTimelockStorage)).to.be.equal(true);
+ });
+});
diff --git a/tools/addRollupType/.gitignore b/tools/addRollupType/.gitignore
index a7ca529c6..8d94ceb78 100644
--- a/tools/addRollupType/.gitignore
+++ b/tools/addRollupType/.gitignore
@@ -1,3 +1,3 @@
-add_rollup_type_output-*.json
+add_rollup_type_output*.json
add_rollup_type.json
genesis.json
\ No newline at end of file
diff --git a/tools/addRollupType/README.md b/tools/addRollupType/README.md
index ff9a2c115..4bd295630 100644
--- a/tools/addRollupType/README.md
+++ b/tools/addRollupType/README.md
@@ -1,5 +1,5 @@
# Add Rollup Type
-Script to call `addNewRollupType` function with no timelock involved
+Script to call `addNewRollupType` function
## Install
```
@@ -7,23 +7,25 @@ npm i
```
## Setup
-- Config file
- - `consensusContract`: select between consensus contract. Supprted: `["PolygonZkEVMEtrog", "PolygonValidiumEtrog"]`
- - `polygonRollupManagerAddress`: polygonRollupManager smart contract address
- - `verifierAddress`: verifier to be used
+- Config file `add_rollup_type.json`:
+ - `consensusContract`: select between consensus contract. Supported: `["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonPessimisticConsensus"]`
+ - `consensusContractAddress`: gets this address instead of deploying a new consensus implementation
+ - `polygonRollupManagerAddress`: `PolygonRollupManager.sol` smart contract address
+ - `verifierAddress`: verifier address to be used
- `description`: string to describe rollup type added. Example: "Type: Validium, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU"
- `forkID`: forkID to be used
- - `rollupCompatibilityID`: rollup compatibility ID
+ - `programVKey`: program key for pessimistic consensus
+ - `genesisRoot`: initial genesis root. Must match the `genesis.json` generated.
- `timelockDelay`: timelock delay
- `timelockSalt(optional)`: timelock salt
- `predecessor(optional)`: timelock predecessor
- `deployerPvtKey(optional)`: private key deployer
- First option will load `deployerPvtKey`. Otherwise, `process.env.MNEMONIC` will be loaded from the `.env` file
- - `maxFeePerGas(optional)`: string, Set `maxFeePerGas`, must define aswell `maxPriorityFeePerGas` to use it
- - `maxPriorityFeePerGas(optional)`: string, Set `maxPriorityFeePerGas`, must define aswell `maxFeePerGas` to use it
+ - `maxFeePerGas(optional)`: string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it
+ - `maxPriorityFeePerGas(optional)`: string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it
- `multiplierGas(optional)`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect
- A network should be selected when running the script
- - examples: `-- sepolia` or `--mainnet`
+ - examples: `--sepolia` or `--mainnet`
- This uses variables set in `hardhat.config.ts`
- Which uses some environment variables that should be set in `.env`
> All paths are from root repository
@@ -45,7 +47,7 @@ cp ./tools/addRollupType/genesis.json.example ./tools/addRollupType/genesis.json
- Set your parameters
- Run tool:
```
-npx hardhat run ./tools/addRollupType/addRollupType.ts --network sepolia
+npx hardhat run ./tools/addRollupType/addRollupType.ts --network
```
### Generate 'addNewRollupType' to the Timelock SC
@@ -58,12 +60,12 @@ cp ./tools/addRollupType/add_rollup_type.json.example ./tools/addRollupType/add_
- Set your parameters
- Run tool:
```
-npx hardhat run ./tools/addRollupType/addRollupType.ts --network sepolia
+npx hardhat run ./tools/addRollupType/addRollupTypeTimelock.ts --network
```
- Output:
- scheduleData
- executeData
> send data to the timelock contract address:
-> - use your favourite browser extension
+> - use your favorite browser extension
> - send tx to timelock address with hex data as `scheduleData`
> - wait timelockDelay and then send `executeData` to timelock address
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet6/add_rollup_type_6.json b/tools/addRollupType/addRollupMainnet6/add_rollup_type_6.json
new file mode 100644
index 000000000..5dc9944e5
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet6/add_rollup_type_6.json
@@ -0,0 +1,16 @@
+{
+ "consensusContract": "PolygonZkEVMEtrog",
+ "polygonconsensusContract": "",
+ "rollupCompatibilityID": 0,
+ "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "verifierAddress": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "description": "Type: zkEVM, Version: Banana , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
+ "forkID": 12,
+ "timelockDelay": 864000,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas":"",
+ "maxPriorityFeePerGas":"",
+ "multiplierGas": "",
+ "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272"
+}
diff --git a/tools/addRollupType/addRollupMainnet6/add_rollup_type_6_output-2024-10-17T10:27:10.362Z.json b/tools/addRollupType/addRollupMainnet6/add_rollup_type_6_output-2024-10-17T10:27:10.362Z.json
new file mode 100644
index 000000000..918cf76e5
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet6/add_rollup_type_6_output-2024-10-17T10:27:10.362Z.json
@@ -0,0 +1,24 @@
+{
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "verifierAddress": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "consensusContract": "PolygonZkEVMEtrog",
+ "scheduleData": "0x01d5062a0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f000000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000007253f329302b1b5e774ac641ea3743e9e3244f2e0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005c547970653a207a6b45564d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d30000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f34eb8eb0000000000000000000000007253f329302b1b5e774ac641ea3743e9e3244f2e0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005c547970653a207a6b45564d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000000000",
+ "id": "0x2e7967087ebb99a28e2b184b1758268579a9aa83a6c25c3e871bba70720f614b",
+ "decodedScheduleData": {
+ "target": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "value": "0",
+ "data": "0xf34eb8eb0000000000000000000000007253f329302b1b5e774ac641ea3743e9e3244f2e0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005c547970653a207a6b45564d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000",
+ "decodedData": {
+ "consensusImplementation": "0x7253F329302b1b5E774Ac641EA3743E9E3244f2E",
+ "verifier": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "forkID": "12",
+ "rollupCompatibilityID": "0",
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "description": "Type: zkEVM, Version: Banana , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet6/genesis-rollup-type-6.json b/tools/addRollupType/addRollupMainnet6/genesis-rollup-type-6.json
new file mode 100644
index 000000000..afa6204b2
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet6/genesis-rollup-type-6.json
@@ -0,0 +1,92 @@
+{
+ "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridge implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridge proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00",
+ "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "0",
+ "nonce": "8",
+ "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet7/add_rollup_type_7.json b/tools/addRollupType/addRollupMainnet7/add_rollup_type_7.json
new file mode 100644
index 000000000..1d65bb57e
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet7/add_rollup_type_7.json
@@ -0,0 +1,16 @@
+{
+ "consensusContract": "PolygonValidiumEtrog",
+ "polygonconsensusContract": "",
+ "rollupCompatibilityID": 0,
+ "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "verifierAddress": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "description": "Type: Validium, Version: Banana , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
+ "forkID": 12,
+ "timelockDelay": 864000,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas":"",
+ "maxPriorityFeePerGas":"",
+ "multiplierGas": "",
+ "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272"
+}
diff --git a/tools/addRollupType/addRollupMainnet7/add_rollup_type_7_output-2024-10-17T10:38:47.981Z.json b/tools/addRollupType/addRollupMainnet7/add_rollup_type_7_output-2024-10-17T10:38:47.981Z.json
new file mode 100644
index 000000000..ab3a836b2
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet7/add_rollup_type_7_output-2024-10-17T10:38:47.981Z.json
@@ -0,0 +1,24 @@
+{
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "verifierAddress": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "consensusContract": "PolygonValidiumEtrog",
+ "scheduleData": "0x01d5062a0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f000000000000000000000000000000000000000000000000000000000000000144f34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005f547970653a2056616c696469756d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d30000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005f547970653a2056616c696469756d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000",
+ "id": "0x8fcaf796dd4cae11d4568a49db2a14f310897611fe142f2b7859d297e44cb41a",
+ "decodedScheduleData": {
+ "target": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "value": "0",
+ "data": "0xf34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f0000000000000000000000009b9671db83cfcb4508bf361942488c5ca2b1286d000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005f547970653a2056616c696469756d2c2056657273696f6e3a2042616e616e61202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500",
+ "decodedData": {
+ "consensusImplementation": "0x427113ae6F319BfFb4459bfF96eb8B6BDe1A127F",
+ "verifier": "0x9B9671dB83CfcB4508bF361942488C5cA2b1286D",
+ "forkID": "12",
+ "rollupCompatibilityID": "0",
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "description": "Type: Validium, Version: Banana , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet7/genesis-rollup-type-7.json b/tools/addRollupType/addRollupMainnet7/genesis-rollup-type-7.json
new file mode 100644
index 000000000..afa6204b2
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet7/genesis-rollup-type-7.json
@@ -0,0 +1,92 @@
+{
+ "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridge implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridge proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00",
+ "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "0",
+ "nonce": "8",
+ "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet8/add_rollup_type_8.json b/tools/addRollupType/addRollupMainnet8/add_rollup_type_8.json
new file mode 100644
index 000000000..7902ed71d
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet8/add_rollup_type_8.json
@@ -0,0 +1,16 @@
+{
+ "consensusContract": "PolygonValidiumEtrog",
+ "polygonconsensusContract": "0x427113ae6F319BfFb4459bfF96eb8B6BDe1A127F",
+ "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "verifierAddress": "0x455ac63E96e6a64EA59C6Da0D8F90FCa3F1535aB",
+ "description": "Type: Validium, Version: fork.13 , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
+ "forkID": 13,
+ "rollupCompatibilityID": 0,
+ "timelockDelay": 864000,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas":"",
+ "maxPriorityFeePerGas":"",
+ "multiplierGas": "",
+ "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272"
+}
diff --git a/tools/addRollupType/addRollupMainnet8/add_rollup_type_8_output-2024-12-20T17:34:02.808Z.json b/tools/addRollupType/addRollupMainnet8/add_rollup_type_8_output-2024-12-20T17:34:02.808Z.json
new file mode 100644
index 000000000..4d9d23900
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet8/add_rollup_type_8_output-2024-12-20T17:34:02.808Z.json
@@ -0,0 +1,24 @@
+{
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "verifierAddress": "0x455ac63E96e6a64EA59C6Da0D8F90FCa3F1535aB",
+ "consensusContract": "PolygonValidiumEtrog",
+ "scheduleData": "0x01d5062a0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f000000000000000000000000000000000000000000000000000000000000000144f34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f000000000000000000000000455ac63e96e6a64ea59c6da0d8f90fca3f1535ab000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060547970653a2056616c696469756d2c2056657273696f6e3a20666f726b2e3133202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d30000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144f34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f000000000000000000000000455ac63e96e6a64ea59c6da0d8f90fca3f1535ab000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060547970653a2056616c696469756d2c2056657273696f6e3a20666f726b2e3133202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000000000000000000000000000000000000000000000000000",
+ "id": "0x5b1239cf6d087e5a3a9361e4898853f27820c03456dea6cb59a9803c8415f76e",
+ "decodedScheduleData": {
+ "target": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "value": "0",
+ "data": "0xf34eb8eb000000000000000000000000427113ae6f319bffb4459bff96eb8b6bde1a127f000000000000000000000000455ac63e96e6a64ea59c6da0d8f90fca3f1535ab000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000000e3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f27200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000060547970653a2056616c696469756d2c2056657273696f6e3a20666f726b2e3133202c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d415955",
+ "decodedData": {
+ "consensusImplementation": "0x427113ae6F319BfFb4459bfF96eb8B6BDe1A127F",
+ "verifier": "0x455ac63E96e6a64EA59C6Da0D8F90FCa3F1535aB",
+ "forkID": "13",
+ "rollupCompatibilityID": "0",
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "description": "Type: Validium, Version: fork.13 , genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/tools/createGenesis/new_genesis.json b/tools/addRollupType/addRollupMainnet8/genesis-rollup-type-8.json
similarity index 100%
rename from tools/createGenesis/new_genesis.json
rename to tools/addRollupType/addRollupMainnet8/genesis-rollup-type-8.json
diff --git a/tools/addRollupType/addRollupMainnet9/add_rollup_type_9.json b/tools/addRollupType/addRollupMainnet9/add_rollup_type_9.json
new file mode 100644
index 000000000..f1ef85c87
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet9/add_rollup_type_9.json
@@ -0,0 +1,16 @@
+{
+ "consensusContract": "PolygonPessimisticConsensus",
+ "consensusContractAddress": "",
+ "polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "verifierAddress": "0xE00a3cBFC45241b33c0A44C78e26168CBc55EC63",
+ "description": "Type: Pessimistic, Version: v0.2.1, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
+ "forkID": 12,
+ "timelockDelay": 864000,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas":"",
+ "maxPriorityFeePerGas":"",
+ "multiplierGas": "",
+ "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "programVKey": "0x0062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a512"
+}
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet9/add_rollup_type_9_output-2025-01-17T16:15:52.866Z.json b/tools/addRollupType/addRollupMainnet9/add_rollup_type_9_output-2025-01-17T16:15:52.866Z.json
new file mode 100644
index 000000000..519b1eaa0
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet9/add_rollup_type_9_output-2025-01-17T16:15:52.866Z.json
@@ -0,0 +1,25 @@
+{
+ "genesis": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "verifierAddress": "0xE00a3cBFC45241b33c0A44C78e26168CBc55EC63",
+ "consensusContract": "PolygonPessimisticConsensus",
+ "scheduleData": "0x01d5062a0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f000000000000000000000000000000000000000000000000000000000000000184abcb519800000000000000000000000018c45dd422f6587357a6d3b23307e75d42b2bc5b000000000000000000000000e00a3cbfc45241b33c0a44c78e26168cbc55ec63000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a5120000000000000000000000000000000000000000000000000000000000000061547970653a2050657373696d69737469632c2056657273696f6e3a2076302e322e312c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d30000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184abcb519800000000000000000000000018c45dd422f6587357a6d3b23307e75d42b2bc5b000000000000000000000000e00a3cbfc45241b33c0a44c78e26168cbc55ec63000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a5120000000000000000000000000000000000000000000000000000000000000061547970653a2050657373696d69737469632c2056657273696f6e3a2076302e322e312c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d4159550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "id": "0x56a65b79e3976426b41227c5c6b0b468436873d7d88df553b9e6637811af1d4a",
+ "decodedScheduleData": {
+ "target": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "value": "0",
+ "data": "0xabcb519800000000000000000000000018c45dd422f6587357a6d3b23307e75d42b2bc5b000000000000000000000000e00a3cbfc45241b33c0a44c78e26168cbc55ec63000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e00062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a5120000000000000000000000000000000000000000000000000000000000000061547970653a2050657373696d69737469632c2056657273696f6e3a2076302e322e312c2067656e657369733a202f697066732f516d55586e526f5062556d5a75455a43477969486a45736f4e6346567533684c74537668706e664253326d41595500000000000000000000000000000000000000000000000000000000000000",
+ "decodedData": {
+ "consensusImplementation": "0x18C45DD422f6587357a6d3b23307E75D42b2bc5B",
+ "verifier": "0xE00a3cBFC45241b33c0A44C78e26168CBc55EC63",
+ "forkID": "12",
+ "rollupVerifierType": "1",
+ "genesis": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "description": "Type: Pessimistic, Version: v0.2.1, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
+ "programVKey": "0x0062c685702e0582d900f3a19521270c92a58e2588230c4a5cf3b45103f4a512"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupMainnet9/genesis-rollup-type-9.json b/tools/addRollupType/addRollupMainnet9/genesis-rollup-type-9.json
new file mode 100644
index 000000000..afa6204b2
--- /dev/null
+++ b/tools/addRollupType/addRollupMainnet9/genesis-rollup-type-9.json
@@ -0,0 +1,92 @@
+{
+ "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridge implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridge proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00",
+ "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "0",
+ "nonce": "8",
+ "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891"
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/tools/addRollupType/addRollupType.ts b/tools/addRollupType/addRollupType.ts
index add37744a..959c17243 100644
--- a/tools/addRollupType/addRollupType.ts
+++ b/tools/addRollupType/addRollupType.ts
@@ -6,23 +6,26 @@ import fs = require("fs");
import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../.env")});
-import {ethers, upgrades} from "hardhat";
+import {ethers, run} from "hardhat";
-const addRollupParameters = require("./add_rollup_type.json");
+const addRollupTypeParameters = require("./add_rollup_type.json");
const genesis = require("./genesis.json");
const dateStr = new Date().toISOString();
-const pathOutputJson = path.join(__dirname, `./add_rollup_type_output-${dateStr}.json`);
+const pathOutputJson = addRollupTypeParameters.outputPath
+ ? path.join(__dirname, addRollupTypeParameters.outputPath)
+ : path.join(__dirname, `./add_rollup_type_output-${dateStr}.json`);
import {PolygonRollupManager} from "../../typechain-types";
import "../../deployment/helpers/utils";
+import {supportedBridgeContracts} from "../utils";
async function main() {
const outputJson = {} as any;
/*
* Check deploy parameters
- * Check that every necessary parameter is fullfilled
+ * Check that every necessary parameter is fulfilled
*/
const mandatoryDeploymentParameters = [
"description",
@@ -30,58 +33,60 @@ async function main() {
"consensusContract",
"polygonRollupManagerAddress",
"verifierAddress",
- "rollupCompatibilityID",
"genesisRoot",
+ "programVKey",
];
for (const parameterName of mandatoryDeploymentParameters) {
- if (addRollupParameters[parameterName] === undefined || addRollupParameters[parameterName] === "") {
+ if (addRollupTypeParameters[parameterName] === undefined || addRollupTypeParameters[parameterName] === "") {
throw new Error(`Missing parameter: ${parameterName}`);
}
}
const {
description,
- rollupCompatibilityID,
forkID,
consensusContract,
polygonRollupManagerAddress,
verifierAddress,
genesisRoot,
- } = addRollupParameters;
+ programVKey,
+ } = addRollupTypeParameters;
- const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog"];
+ const supportedConsensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonPessimisticConsensus"];
+ const isPessimistic = consensusContract === "PolygonPessimisticConsensus";
- if (!supportedConensus.includes(consensusContract)) {
- throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`);
+ if (!supportedConsensus.includes(consensusContract)) {
+ throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConsensus}`);
}
// Load provider
let currentProvider = ethers.provider;
- if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) {
+ if (addRollupTypeParameters.multiplierGas || addRollupTypeParameters.maxFeePerGas) {
if (process.env.HARDHAT_NETWORK !== "hardhat") {
currentProvider = ethers.getDefaultProvider(
`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
) as any;
- if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) {
+ if (addRollupTypeParameters.maxPriorityFeePerGas && addRollupTypeParameters.maxFeePerGas) {
console.log(
- `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei`
+ `Hardcoded gas used: MaxPriority${addRollupTypeParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupTypeParameters.maxFeePerGas} gwei`
);
const FEE_DATA = new ethers.FeeData(
null,
- ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"),
- ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei")
+ ethers.parseUnits(addRollupTypeParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(addRollupTypeParameters.maxPriorityFeePerGas, "gwei")
);
currentProvider.getFeeData = async () => FEE_DATA;
} else {
- console.log("Multiplier gas used: ", addRollupParameters.multiplierGas);
+ console.log("Multiplier gas used: ", addRollupTypeParameters.multiplierGas);
async function overrideFeeData() {
const feedata = await ethers.provider.getFeeData();
return new ethers.FeeData(
null,
- ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n,
- ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n
+ ((feedata.maxFeePerGas as bigint) * BigInt(addRollupTypeParameters.multiplierGas)) / 1000n,
+ ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupTypeParameters.multiplierGas)) /
+ 1000n
);
}
currentProvider.getFeeData = overrideFeeData;
@@ -91,8 +96,8 @@ async function main() {
// Load deployer
let deployer;
- if (addRollupParameters.deployerPvtKey) {
- deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider);
+ if (addRollupTypeParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(addRollupTypeParameters.deployerPvtKey, currentProvider);
} else if (process.env.MNEMONIC) {
deployer = ethers.HDNodeWallet.fromMnemonic(
ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
@@ -105,8 +110,8 @@ async function main() {
console.log("Using with: ", deployer.address);
// Load Rollup manager
- const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
- const rollupManagerContract = PolgonRollupManagerFactory.attach(
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
polygonRollupManagerAddress
) as PolygonRollupManager;
@@ -115,24 +120,29 @@ async function main() {
const polygonZkEVMGlobalExitRootAddress = await rollupManagerContract.globalExitRootManager();
const polTokenAddress = await rollupManagerContract.pol();
- // Sanity checks genesisRoot
- if (genesisRoot !== genesis.root) {
- throw new Error(`Genesis root in the 'add_rollup_type.json' does not match the root in the 'genesis.json'`);
- }
+ if (!isPessimistic) {
+ // checks for rollups
+ // Sanity checks genesisRoot
+ if (genesisRoot !== genesis.root) {
+ throw new Error(`Genesis root in the 'add_rollup_type.json' does not match the root in the 'genesis.json'`);
+ }
- // get bridge address in genesis file
- let genesisBridgeAddress = ethers.ZeroAddress;
- for (let i = 0; i < genesis.genesis.length; i++) {
- if (genesis.genesis[i].contractName === "PolygonZkEVMBridge proxy") {
- genesisBridgeAddress = genesis.genesis[i].address;
- break;
+ // get bridge address in genesis file
+ let genesisBridgeAddress = ethers.ZeroAddress;
+ let bridgeContractName = "";
+ for (let i = 0; i < genesis.genesis.length; i++) {
+ if (supportedBridgeContracts.includes(genesis.genesis[i].contractName)) {
+ genesisBridgeAddress = genesis.genesis[i].address;
+ bridgeContractName = genesis.genesis[i].contractName;
+ break;
+ }
}
- }
- if (polygonZkEVMBridgeAddress.toLowerCase() !== genesisBridgeAddress.toLowerCase()) {
- throw new Error(
- `'PolygonZkEVMBridge proxy' root in the 'genesis.json' does not match 'bridgeAddress' in the 'PolygonRollupManager'`
- );
+ if (polygonZkEVMBridgeAddress.toLowerCase() !== genesisBridgeAddress.toLowerCase()) {
+ throw new Error(
+ `'${bridgeContractName}' root in the 'genesis.json' does not match 'bridgeAddress' in the 'PolygonRollupManager'`
+ );
+ }
}
// Check roles
@@ -151,52 +161,80 @@ async function main() {
await rollupManagerContract.grantRole(ADD_ROLLUP_TYPE_ROLE, deployer.address);
// Create consensus implementation if needed
- let polygonConsensusContractAddress;
+ let consensusContractAddress;
if (
- typeof addRollupParameters.polygonconsensusContract !== "undefined" &&
- ethers.isAddress(addRollupParameters.polygonconsensusContract)
+ typeof addRollupTypeParameters.consensusContractAddress !== "undefined" &&
+ ethers.isAddress(addRollupTypeParameters.consensusContractAddress)
) {
- polygonConsensusContractAddress = addRollupParameters.polygonconsensusContract;
+ consensusContractAddress = addRollupTypeParameters.consensusContractAddress;
} else {
- const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any;
- let PolygonconsensusContract;
+ const PolygonConsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any;
+ let PolygonConsensusContract;
- PolygonconsensusContract = await PolygonconsensusFactory.deploy(
+ PolygonConsensusContract = await PolygonConsensusFactory.deploy(
polygonZkEVMGlobalExitRootAddress,
polTokenAddress,
polygonZkEVMBridgeAddress,
polygonRollupManagerAddress
);
- await PolygonconsensusContract.waitForDeployment();
-
+ await PolygonConsensusContract.waitForDeployment();
console.log("#######################\n");
- console.log(`new PolygonconsensusContract impl: ${PolygonconsensusContract.target}`);
+ console.log(`new consensus name: ${consensusContract}`);
+ console.log(`new PolygonConsensusContract impl: ${PolygonConsensusContract.target}`);
+
+ try {
+ console.log("Verifying contract...");
+ await run("verify:verify", {
+ address: PolygonConsensusContract.target,
+ constructorArguments: [
+ polygonZkEVMGlobalExitRootAddress,
+ polTokenAddress,
+ polygonZkEVMBridgeAddress,
+ polygonRollupManagerAddress,
+ ],
+ });
+ } catch (e) {
+ console.log("Automatic verification failed. Please verify the contract manually.");
+ console.log("you can verify the new impl address with:");
+ console.log(
+ `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonConsensusContract.target} --network ${process.env.HARDHAT_NETWORK}\n`
+ );
+ console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
+ polygonZkEVMGlobalExitRootAddress,
+ polTokenAddress,
+ polygonZkEVMBridgeAddress,
+ polygonRollupManagerAddress,
+ ]);
+ }
+ consensusContractAddress = PolygonConsensusContract.target;
+ }
- console.log("you can verify the new impl address with:");
- console.log(
- `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonconsensusContract.target} --network ${process.env.HARDHAT_NETWORK}\n`
- );
- console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
- polygonZkEVMGlobalExitRootAddress,
- polTokenAddress,
- polygonZkEVMBridgeAddress,
- polygonRollupManagerAddress,
- ]);
+ // Add a new rollup type
+ let rollupVerifierType;
+ let genesisFinal;
+ let programVKeyFinal;
- polygonConsensusContractAddress = PolygonconsensusContract.target;
+ if (consensusContract == "PolygonPessimisticConsensus") {
+ rollupVerifierType = 1;
+ genesisFinal = ethers.ZeroHash;
+ programVKeyFinal = programVKey || ethers.ZeroHash;
+ } else {
+ rollupVerifierType = 0;
+ genesisFinal = genesis.root;
+ programVKeyFinal = ethers.ZeroHash;
}
- // Add a new rollup type with timelock
console.log(
await (
await rollupManagerContract.addNewRollupType(
- polygonConsensusContractAddress,
+ consensusContractAddress,
verifierAddress,
forkID,
- rollupCompatibilityID,
- genesis.root,
- description
+ rollupVerifierType,
+ genesisFinal,
+ description,
+ programVKeyFinal
)
).wait()
);
@@ -209,9 +247,10 @@ async function main() {
outputJson.verifierAddress = verifierAddress;
outputJson.consensusContract = consensusContract;
outputJson.rollupTypeID = newRollupTypeID;
+ outputJson.programVKey = programVKeyFinal;
+ outputJson.consensusContractAddress = consensusContractAddress;
// add time to output path
- const dateStr = new Date().toISOString();
fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1));
}
diff --git a/tools/addRollupType/addRollupTypeTimelock.ts b/tools/addRollupType/addRollupTypeTimelock.ts
index 5951a3e3b..3403b84fe 100644
--- a/tools/addRollupType/addRollupTypeTimelock.ts
+++ b/tools/addRollupType/addRollupTypeTimelock.ts
@@ -6,85 +6,94 @@ import fs = require("fs");
import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../.env")});
-import {ethers, upgrades} from "hardhat";
+import {ethers, run} from "hardhat";
-const addRollupParameters = require("./add_rollup_type.json");
+const addRollupTypeParameters = require("./add_rollup_type.json");
const genesis = require("./genesis.json");
const dateStr = new Date().toISOString();
-const pathOutputJson = path.join(__dirname, `./add_rollup_type_output-${dateStr}.json`);
-import {PolygonRollupManager} from "../../typechain-types";
+const pathOutputJson = addRollupTypeParameters.outputPath
+ ? path.join(__dirname, addRollupTypeParameters.outputPath)
+ : path.join(__dirname, `./add_rollup_type_output-${dateStr}.json`);
import "../../deployment/helpers/utils";
+import {supportedBridgeContracts} from "../utils";
async function main() {
const outputJson = {} as any;
/*
* Check deploy parameters
- * Check that every necessary parameter is fullfilled
+ * Check that every necessary parameter is fulfilled
*/
const mandatoryDeploymentParameters = [
"description",
"forkID",
"consensusContract",
"verifierAddress",
- "rollupCompatibilityID",
"timelockDelay",
"genesisRoot",
+ "programVKey",
];
for (const parameterName of mandatoryDeploymentParameters) {
- if (addRollupParameters[parameterName] === undefined || addRollupParameters[parameterName] === "") {
+ if (addRollupTypeParameters[parameterName] === undefined || addRollupTypeParameters[parameterName] === "") {
throw new Error(`Missing parameter: ${parameterName}`);
}
}
const {
description,
- rollupCompatibilityID,
forkID,
consensusContract,
polygonRollupManagerAddress,
verifierAddress,
timelockDelay,
genesisRoot,
- } = addRollupParameters;
+ programVKey,
+ } = addRollupTypeParameters;
- const salt = addRollupParameters.timelockSalt || ethers.ZeroHash;
- const predecessor = addRollupParameters.predecessor || ethers.ZeroHash;
+ const salt = addRollupTypeParameters.timelockSalt || ethers.ZeroHash;
+ const predecessor = addRollupTypeParameters.predecessor || ethers.ZeroHash;
- const supportedConensus = ["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonValidiumStorageMigration"];
+ const supportedConsensus = [
+ "PolygonZkEVMEtrog",
+ "PolygonValidiumEtrog",
+ "PolygonValidiumStorageMigration",
+ "PolygonPessimisticConsensus",
+ ];
+ const isPessimistic = consensusContract === "PolygonPessimisticConsensus";
- if (!supportedConensus.includes(consensusContract)) {
- throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConensus}`);
+ if (!supportedConsensus.includes(consensusContract)) {
+ throw new Error(`Consensus contract not supported, supported contracts are: ${supportedConsensus}`);
}
// Load provider
let currentProvider = ethers.provider;
- if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) {
+ if (addRollupTypeParameters.multiplierGas || addRollupTypeParameters.maxFeePerGas) {
if (process.env.HARDHAT_NETWORK !== "hardhat") {
currentProvider = ethers.getDefaultProvider(
`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
) as any;
- if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) {
+ if (addRollupTypeParameters.maxPriorityFeePerGas && addRollupTypeParameters.maxFeePerGas) {
console.log(
- `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei`
+ `Hardcoded gas used: MaxPriority${addRollupTypeParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupTypeParameters.maxFeePerGas} gwei`
);
const FEE_DATA = new ethers.FeeData(
null,
- ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"),
- ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei")
+ ethers.parseUnits(addRollupTypeParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(addRollupTypeParameters.maxPriorityFeePerGas, "gwei")
);
currentProvider.getFeeData = async () => FEE_DATA;
} else {
- console.log("Multiplier gas used: ", addRollupParameters.multiplierGas);
+ console.log("Multiplier gas used: ", addRollupTypeParameters.multiplierGas);
async function overrideFeeData() {
- const feedata = await ethers.provider.getFeeData();
+ const feeData = await ethers.provider.getFeeData();
return new ethers.FeeData(
null,
- ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n,
- ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n
+ ((feeData.maxFeePerGas as bigint) * BigInt(addRollupTypeParameters.multiplierGas)) / 1000n,
+ ((feeData.maxPriorityFeePerGas as bigint) * BigInt(addRollupTypeParameters.multiplierGas)) /
+ 1000n
);
}
currentProvider.getFeeData = overrideFeeData;
@@ -94,8 +103,8 @@ async function main() {
// Load deployer
let deployer;
- if (addRollupParameters.deployerPvtKey) {
- deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider);
+ if (addRollupTypeParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(addRollupTypeParameters.deployerPvtKey, currentProvider);
} else if (process.env.MNEMONIC) {
deployer = ethers.HDNodeWallet.fromMnemonic(
ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
@@ -108,8 +117,8 @@ async function main() {
console.log("Using with: ", deployer.address);
// Load Rollup manager
- const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
- const rollupManagerContract = PolgonRollupManagerFactory.attach(
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
polygonRollupManagerAddress
) as PolygonRollupManager;
@@ -118,75 +127,111 @@ async function main() {
const polygonZkEVMGlobalExitRootAddress = await rollupManagerContract.globalExitRootManager();
const polTokenAddress = await rollupManagerContract.pol();
- // Sanity checks genesisRoot
- if (genesisRoot !== genesis.root) {
- throw new Error(`Genesis root in the 'add_rollup_type.json' does not match the root in the 'genesis.json'`);
- }
+ if (!isPessimistic) {
+ // checks for rollups
+ // Sanity checks genesisRoot
+ if (genesisRoot !== genesis.root) {
+ throw new Error(`Genesis root in the 'add_rollup_type.json' does not match the root in the 'genesis.json'`);
+ }
- // get bridge address in genesis file
- let genesisBridgeAddress = ethers.ZeroAddress;
- for (let i = 0; i < genesis.genesis.length; i++) {
- if (genesis.genesis[i].contractName === "PolygonZkEVMBridge proxy") {
- genesisBridgeAddress = genesis.genesis[i].address;
- break;
+ // get bridge address in genesis file
+ let genesisBridgeAddress = ethers.ZeroAddress;
+ let bridgeContractName = "";
+ for (let i = 0; i < genesis.genesis.length; i++) {
+ if (supportedBridgeContracts.includes(genesis.genesis[i].contractName)) {
+ genesisBridgeAddress = genesis.genesis[i].address;
+ bridgeContractName = genesis.genesis[i].contractName;
+ break;
+ }
}
- }
- if (polygonZkEVMBridgeAddress.toLowerCase() !== genesisBridgeAddress.toLowerCase()) {
- throw new Error(
- `'PolygonZkEVMBridge proxy' root in the 'genesis.json' does not match 'bridgeAddress' in the 'PolygonRollupManager'`
- );
+ if (polygonZkEVMBridgeAddress.toLowerCase() !== genesisBridgeAddress.toLowerCase()) {
+ throw new Error(
+ `'${bridgeContractName}' root in the 'genesis.json' does not match 'bridgeAddress' in the 'PolygonRollupManager'`
+ );
+ }
}
- // Create consensus implementation
- const PolygonconsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any;
- let PolygonconsensusContract;
- let PolygonconsensusContractAddress;
+ // Create consensus implementation if needed
+ const PolygonConsensusFactory = (await ethers.getContractFactory(consensusContract, deployer)) as any;
+ let PolygonConsensusContract;
+ let PolygonConsensusContractAddress;
if (
- addRollupParameters.polygonconsensusContract === undefined ||
- addRollupParameters.polygonconsensusContract === ""
+ typeof addRollupTypeParameters.consensusContractAddress !== "undefined" &&
+ ethers.isAddress(addRollupTypeParameters.consensusContractAddress)
) {
- PolygonconsensusContract = await PolygonconsensusFactory.deploy(
+ PolygonConsensusContractAddress = addRollupTypeParameters.consensusContractAddress;
+ } else {
+ PolygonConsensusContract = await PolygonConsensusFactory.deploy(
polygonZkEVMGlobalExitRootAddress,
polTokenAddress,
polygonZkEVMBridgeAddress,
polygonRollupManagerAddress
);
- await PolygonconsensusContract.waitForDeployment();
+ await PolygonConsensusContract.waitForDeployment();
- PolygonconsensusContractAddress = PolygonconsensusContract.target;
+ PolygonConsensusContractAddress = PolygonConsensusContract.target;
console.log("#######################\n");
- console.log(`new PolygonconsensusContract impl: ${PolygonconsensusContractAddress}`);
-
- console.log("you can verify the new impl address with:");
- console.log(
- `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonconsensusContractAddress} --network ${process.env.HARDHAT_NETWORK}\n`
- );
- console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
- polygonZkEVMGlobalExitRootAddress,
- polTokenAddress,
- polygonZkEVMBridgeAddress,
- polygonRollupManagerAddress,
- ]);
- } else {
- PolygonconsensusContractAddress = addRollupParameters.polygonconsensusContract;
+ console.log(`new consensus name: ${consensusContract}`);
+ console.log(`new PolygonConsensusContract impl: ${PolygonConsensusContractAddress}`);
+
+ try {
+ console.log("Verifying contract...");
+ await run("verify:verify", {
+ address: PolygonConsensusContract.target,
+ constructorArguments: [
+ polygonZkEVMGlobalExitRootAddress,
+ polTokenAddress,
+ polygonZkEVMBridgeAddress,
+ polygonRollupManagerAddress,
+ ],
+ });
+ } catch (e) {
+ console.log("Automatic verification failed. Please verify the contract manually.");
+ console.log("you can verify the new impl address with:");
+ console.log(
+ `npx hardhat verify --constructor-args upgrade/arguments.js ${PolygonConsensusContract.target} --network ${process.env.HARDHAT_NETWORK}\n`
+ );
+ console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
+ polygonZkEVMGlobalExitRootAddress,
+ polTokenAddress,
+ polygonZkEVMBridgeAddress,
+ polygonRollupManagerAddress,
+ ]);
+ }
}
// load timelock
const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+ // Add a new rollup type
+ let rollupVerifierType;
+ let genesisFinal;
+ let programVKeyFinal;
+
+ if (consensusContract == "PolygonPessimisticConsensus") {
+ rollupVerifierType = 1;
+ genesisFinal = ethers.ZeroHash;
+ programVKeyFinal = programVKey || ethers.ZeroHash;
+ } else {
+ rollupVerifierType = 0;
+ genesisFinal = genesis.root;
+ programVKeyFinal = ethers.ZeroHash;
+ }
+
const operation = genOperation(
polygonRollupManagerAddress,
0, // value
- PolgonRollupManagerFactory.interface.encodeFunctionData("addNewRollupType", [
- PolygonconsensusContractAddress,
+ PolygonRollupManagerFactory.interface.encodeFunctionData("addNewRollupType", [
+ PolygonConsensusContractAddress,
verifierAddress,
forkID,
- rollupCompatibilityID,
- genesis.root,
+ rollupVerifierType,
+ genesisFinal,
description,
+ programVKeyFinal,
]),
predecessor, // predecessor
salt // salt
@@ -220,7 +265,7 @@ async function main() {
outputJson.executeData = executeData;
outputJson.id = operation.id;
- // Decode the scheduleData for better readibility
+ // Decode the scheduleData for better readability
const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
const paramsArray = timelockTx?.fragment.inputs;
const objectDecoded = {};
@@ -231,7 +276,7 @@ async function main() {
objectDecoded[currentParam.name] = timelockTx?.args[i];
if (currentParam.name == "data") {
- const decodedRollupManagerData = PolgonRollupManagerFactory.interface.parseTransaction({
+ const decodedRollupManagerData = PolygonRollupManagerFactory.interface.parseTransaction({
data: timelockTx?.args[i],
});
const objectDecodedData = {};
@@ -247,7 +292,7 @@ async function main() {
outputJson.decodedScheduleData = objectDecoded;
- // Decode the schedule data to better readibiltiy:
+ // Decode the schedule data to better readability:
fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1));
}
diff --git a/tools/addRollupType/add_rollup_type.json.example b/tools/addRollupType/add_rollup_type.json.example
index f65f64c56..d1e76ba2f 100644
--- a/tools/addRollupType/add_rollup_type.json.example
+++ b/tools/addRollupType/add_rollup_type.json.example
@@ -1,16 +1,16 @@
{
"consensusContract": "PolygonValidiumEtrog",
- "polygonconsensusContract": "",
+ "consensusContractAddress": "",
"polygonRollupManagerAddress": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
"verifierAddress": "0x1C3A3da552b8662CD69538356b1E7c2E9CC1EBD8",
"description": "Type: Validium, Version: etrog, genesis: /ipfs/QmUXnRoPbUmZuEZCGyiHjEsoNcFVu3hLtSvhpnfBS2mAYU",
"forkID": 7,
- "rollupCompatibilityID": 0,
"timelockDelay": 864000,
"timelockSalt": "",
"deployerPvtKey": "",
"maxFeePerGas":"",
"maxPriorityFeePerGas":"",
"multiplierGas": "",
- "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272"
+ "genesisRoot": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "programVKey": "0xaabbccddeeff00112233445566778899aabbccddeeff00112233445566778899"
}
diff --git a/tools/batchL2DataCreatedRollup/.gitignore b/tools/batchL2DataCreatedRollup/.gitignore
new file mode 100644
index 000000000..e1239ebef
--- /dev/null
+++ b/tools/batchL2DataCreatedRollup/.gitignore
@@ -0,0 +1,2 @@
+input.json
+tx.json
\ No newline at end of file
diff --git a/tools/batchL2DataCreatedRollup/generateBatchL2DataCreatedRollup.ts b/tools/batchL2DataCreatedRollup/generateBatchL2DataCreatedRollup.ts
new file mode 100644
index 000000000..58840e05c
--- /dev/null
+++ b/tools/batchL2DataCreatedRollup/generateBatchL2DataCreatedRollup.ts
@@ -0,0 +1,37 @@
+import hre from "hardhat";
+import fs from "fs";
+import input from "./input.json";
+import {
+ PolygonZkEVMBridgeV2,
+} from "../../typechain-types";
+
+async function main() {
+
+ // --network
+ const bridgeFactory = await hre.ethers.getContractFactory("PolygonZkEVMBridgeV2");
+ const polygonZkEVMBridgeContract = bridgeFactory.attach(input.bridgeAddress) as PolygonZkEVMBridgeV2;
+ const gasTokenMetadata = await polygonZkEVMBridgeContract.getTokenMetadata(input.gasTokenAddress);
+
+ // switch network hardhat
+ await hre.switchNetwork("hardhat");
+
+ const toolFactory = await hre.ethers.getContractFactory("BatchL2DataCreatedRollup");
+ const toolContract = await toolFactory.deploy();
+ await toolContract.waitForDeployment()
+ const tx = await toolContract.generateInitializeTransaction(input.networkID, input.bridgeAddress, input.gasTokenAddress, input.gasTokenNetwork, gasTokenMetadata)
+ const output = {
+ networkID: input.networkID,
+ tx: tx,
+ }
+
+ // write tx.json
+ const txPath = "./tx.json"
+ fs.writeFileSync(txPath, JSON.stringify(output, null, 1))
+}
+main().then(() => {
+ process.exit(0);
+}, (err) => {
+ console.log(err.message);
+ console.log(err.stack);
+ process.exit(1);
+});
\ No newline at end of file
diff --git a/tools/batchL2DataCreatedRollup/input.json.example b/tools/batchL2DataCreatedRollup/input.json.example
new file mode 100644
index 000000000..5e69a0d3e
--- /dev/null
+++ b/tools/batchL2DataCreatedRollup/input.json.example
@@ -0,0 +1,6 @@
+{
+ "networkID": 0,
+ "bridgeAddress": "0x9b28F436039654F8b948dd32599032F684899cF0",
+ "gasTokenAddress": "0x0000000000000000000000000000000000000000",
+ "gasTokenNetwork": 0
+}
\ No newline at end of file
diff --git a/tools/changeDelayTimelock/.gitignore b/tools/changeDelayTimelock/.gitignore
new file mode 100644
index 000000000..bcbd021a1
--- /dev/null
+++ b/tools/changeDelayTimelock/.gitignore
@@ -0,0 +1,2 @@
+change_delay_output-*
+change_delay_timelock.json
\ No newline at end of file
diff --git a/tools/changeDelayTimelock/README.md b/tools/changeDelayTimelock/README.md
new file mode 100644
index 000000000..7df7878ab
--- /dev/null
+++ b/tools/changeDelayTimelock/README.md
@@ -0,0 +1,35 @@
+# Change minDelay PolygonZkEVMTimelock
+Script to change `minDelay` from `PolygonZkEVMTimelock`
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `change_delay_timelock.json`:
+ - `timelockContractAddress`: timelock contract address
+ - `newMinDelay`: new `minDelay`
+ - `timeLockDelay`: timelockDelay (by defalult `timeLockDelay` == current `minDelay`)
+ - `timelockSalt(optional)`: timelock salt
+ - `predecessor(optional)`: timelock predecessor
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+> All paths are from root repository
+
+## Usage
+> All commands are done from root repository.
+
+- Copy configuration file:
+```
+cp ./tools/changeDelayTimelock/change_delay_timelock.json.example ./tools/changeDelayTimelock/change_delay_timelock.json
+```
+- Set your parameters
+- Run tool:
+```
+npx hardhat run ./tools/changeDelayTimelock/changeDelayTimelock.ts --network localhost
+```
+
+
diff --git a/tools/changeDelayTimelock/changeDelayTimelock.ts b/tools/changeDelayTimelock/changeDelayTimelock.ts
new file mode 100644
index 000000000..3fb5f1037
--- /dev/null
+++ b/tools/changeDelayTimelock/changeDelayTimelock.ts
@@ -0,0 +1,121 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
+import {utils} from "ffjavascript";
+import path = require("path");
+import fs = require("fs");
+
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../../.env")});
+import {ethers, network, upgrades} from "hardhat";
+import { PolygonZkEVMTimelock } from "../../typechain-types";
+
+const parameters = require("./change_delay_timelock.json");
+const dateStr = new Date().toISOString();
+const pathOutputJson = path.resolve(__dirname, `./change_delay_output-${dateStr}.json`);
+
+async function main() {
+
+ const outputJson = {} as any;
+
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock");
+ const timelockContract = (await timelockContractFactory.attach(
+ parameters.timelockContractAddress
+ )) as PolygonZkEVMTimelock;
+
+ console.log("#######################\n");
+ console.log("timelockContract address: ", timelockContract.target)
+ console.log("#######################\n");
+
+ const timelockDelay = parameters.timeLockDelay ? parameters.timeLockDelay : Number(await timelockContract.getMinDelay());
+ const salt = parameters.timelockSalt || ethers.ZeroHash;
+ const predecessor = parameters.predecessor || ethers.ZeroHash;
+
+ const operation = genOperation(
+ parameters.timelockContractAddress,
+ 0, // value
+ timelockContract.interface.encodeFunctionData(
+ 'updateDelay',
+ [parameters.newMinDelay],
+ ),
+ predecessor, // predecessor
+ salt // salt
+ );
+
+ // Schedule operation
+ const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [
+ operation.target,
+ operation.value,
+ operation.data,
+ operation.predecessor,
+ operation.salt,
+ timelockDelay,
+ ]);
+
+ // Execute operation
+ const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [
+ operation.target,
+ operation.value,
+ operation.data,
+ operation.predecessor,
+ operation.salt,
+ ]);
+
+ console.log("timelockDelay: ", timelockDelay)
+ console.log({scheduleData});
+ console.log({executeData});
+
+ outputJson.scheduleData = scheduleData;
+ outputJson.executeData = executeData;
+
+ // Decode the scheduleData for better readability
+ const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
+ const paramsArray = timelockTx?.fragment.inputs as any;
+ const objectDecoded = {} as any;
+
+ for (let i = 0; i < paramsArray?.length; i++) {
+ const currentParam = paramsArray[i];
+ objectDecoded[currentParam.name] = timelockTx?.args[i];
+
+ if (currentParam.name == "data") {
+ const decodedTimelockTx = timelockContractFactory.interface.parseTransaction({
+ data: timelockTx?.args[i],
+ });
+ const objectDecodedData = {} as any;
+ const paramsArrayData = decodedTimelockTx?.fragment.inputs as any;
+
+ objectDecodedData.signature = decodedTimelockTx?.signature;
+ objectDecodedData.selector = decodedTimelockTx?.selector;
+
+ for (let j = 0; j < paramsArrayData?.length; j++) {
+ const currentParam = paramsArrayData[j];
+ objectDecodedData[currentParam.name] = decodedTimelockTx?.args[j];
+ }
+ objectDecoded["decodedData"] = objectDecodedData;
+ }
+ }
+ outputJson.decodedScheduleData = objectDecoded;
+
+ await fs.writeFileSync(pathOutputJson, JSON.stringify(utils.stringifyBigInts(outputJson), null, 1));
+}
+
+// OZ test functions
+function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) {
+ const abiEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["address", "uint256", "bytes", "uint256", "bytes32"],
+ [target, value, data, predecessor, salt]
+ );
+ const id = ethers.keccak256(abiEncoded);
+ return {
+ id,
+ target,
+ value,
+ data,
+ predecessor,
+ salt,
+ };
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
diff --git a/tools/changeDelayTimelock/change_delay_timelock.json.example b/tools/changeDelayTimelock/change_delay_timelock.json.example
new file mode 100644
index 000000000..0a4ec9d0f
--- /dev/null
+++ b/tools/changeDelayTimelock/change_delay_timelock.json.example
@@ -0,0 +1,7 @@
+{
+ "timelockContractAddress": "0x0165878A594ca255338adfa4d48449f69242Eb8F",
+ "newMinDelay": 1800,
+ "timeLockDelay": "",
+ "predecessor": "",
+ "timelockSalt": ""
+}
\ No newline at end of file
diff --git a/tools/createNewRollup/.gitignore b/tools/createNewRollup/.gitignore
new file mode 100644
index 000000000..bbc469664
--- /dev/null
+++ b/tools/createNewRollup/.gitignore
@@ -0,0 +1,5 @@
+create_new_rollup.json
+genesis.json
+genesis_sovereign.json
+create_new_rollup_output.json
+create_new_rollup_output*.json
\ No newline at end of file
diff --git a/tools/createNewRollup/README.md b/tools/createNewRollup/README.md
new file mode 100644
index 000000000..c81a31ce9
--- /dev/null
+++ b/tools/createNewRollup/README.md
@@ -0,0 +1,69 @@
+# Create new Rollup
+Script to call `createNewRollup` function.
+- This script needs of a genesis as input only if we are trying to deploy a sovereign chain. The genesis will only be updated in case of trying to deploy a sovereign chain. In this case, this new sovereign genesis will be appended at the output file
+
+## Setup
+- install packages
+```
+npm i
+```
+
+- Set env variables
+````
+cp .env.example .env
+````
+
+Fill `.env` with your `INFURA_PROJECT_ID` and `ETHERSCAN_API_KEY`
+
+- Copy configuration files:
+```
+cp ./tools/createNewRollup/create_new_rollup.json.example ./tools/createNewRollup/create_new_rollup.json
+```
+
+- Copy genesis file (only for sovereign chains)
+```
+cp ./tools/createNewRollup/genesis.json.example ./tools/createNewRollup/genesis.json
+```
+
+- Set your parameters -> create_new_rollup.json
+ - `type`: Specify the type of rollup creation, only available:
+ - `EOA`: If creating the rollup from a wallet, the script will execute the creation of the rollup on the specified network
+ - `Multisig`: If creating the rollup from a multisig, the script will output the calldata of the transaction to execute for creating the rollup
+ - `Timelock`: If creating the rollup through a timelock, the script will output the execute and schedule data to send to the timelock contract
+ - `trustedSequencerURL`: Sequencer URL of the new created rollup
+ - `networkName`: Network name of the new created rollup
+ - `trustedSequencer`: Sequencer address of the new created rollup
+ - `chainID`: ChainID of the rollup, must be a new one, can not have more than 32 bits
+ - `rollupAdminAddress`: Admin address of the new created rollup
+ - `consensusContractName`: select between consensus contract. Supported: `["PolygonZkEVMEtrog", "PolygonValidiumEtrog", "PolygonPessimisticConsensus"]`. This is the name of the consensus of the rollupType of the rollup to be created
+ - `gasTokenAddress`: Address of the native gas token of the rollup, zero if ether
+ - `deployerPvtKey`: Not mandatory, used to deploy from specific wallet
+ - `maxFeePerGas(optional)`: string, Set `maxFeePerGas`, must define as well `maxPriorityFeePerGas` to use it
+ - `maxPriorityFeePerGas(optional)`: string, Set `maxPriorityFeePerGas`, must define as well `maxFeePerGas` to use it
+ - `multiplierGas(optional)`: number, Gas multiplier with 3 decimals. If `maxFeePerGas` and `maxPriorityFeePerGas` are set, this will not take effect
+ - `timelockDelay(optional)`: timelock delay, only required on timelock type
+ - `timelockSalt(optional)`: timelock salt, only required on timelock type
+ - `rollupManagerAddress`: Address of deployed rollupManager contract
+ - `rollupTypeId`: The id of the rollup type of the rollup to deploy. WARNING: the type must match with the `consensusContractName`. Example: if the type is validium, the contract name has to be `PolygonValidiumEtrog`
+ - `isVanillaClient`: Flag for vanilla/sovereign clients handling
+ - `sovereignParams`:
+ - `bridgeManager`: bridge manager address
+ - `sovereignWETHAddress`: sovereign WETH address
+ - `sovereignWETHAddressIsNotMintable`: Flag to indicate if the wrapped ETH is not mintable
+ - `globalExitRootUpdater`: Address of globalExitRootUpdater for sovereign chains
+ - `globalExitRootRemover`: Address of globalExitRootRemover for sovereign chains
+
+- Set your parameters -> genesis.json
+ - Is the genesis used to create the rollupType
+ - It is only necessary in case you want to create a sovereign/vanilla chain because it will be updated
+
+- Run tool:
+```
+npx hardhat run ./tools/createNewRollup/createNewRollup.ts --network sepolia
+```
+
+### More Info
+- All commands are done from root repository
+- The output files will be saved at `./tools/createNewRollup/create_new_rollup_output_{type}_{date}.json`
+- In case is a sovereign chain, the updated genesis is saved inside the output file, the original `genesis.json` is not modified
+- If the script fails, check the logs, most of the errors are handled and are auto explanatory
\ No newline at end of file
diff --git a/tools/createNewRollup/createNewRollup.ts b/tools/createNewRollup/createNewRollup.ts
new file mode 100644
index 000000000..c26235592
--- /dev/null
+++ b/tools/createNewRollup/createNewRollup.ts
@@ -0,0 +1,577 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
+import {expect} from "chai";
+import path = require("path");
+import fs = require("fs");
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../.env")});
+import {ethers, upgrades} from "hardhat";
+import {processorUtils, Constants} from "@0xpolygonhermez/zkevm-commonjs";
+import {VerifierType, ConsensusContracts} from "../../src/pessimistic-utils";
+const createRollupParameters = require("./create_new_rollup.json");
+import {genOperation, transactionTypes, convertBigIntsToNumbers} from "../utils";
+import updateVanillaGenesis from "../../deployment/v2/utils/updateVanillaGenesis";
+
+import {
+ PolygonRollupManager,
+ PolygonZkEVMEtrog,
+ PolygonZkEVMBridgeV2,
+ PolygonValidiumEtrog,
+ PolygonPessimisticConsensus,
+} from "../../typechain-types";
+
+async function main() {
+ console.log(`Starting script to create new rollup from ${createRollupParameters.type}...`);
+ const outputJson = {} as any;
+ const dateStr = new Date().toISOString();
+ const destPath = createRollupParameters.outputPath
+ ? path.join(__dirname, createRollupParameters.outputPath)
+ : path.join(__dirname, `create_new_rollup_output_${createRollupParameters.type}_${dateStr}.json`);
+
+ /*
+ * Check deploy parameters
+ * Check that every necessary parameter is fulfilled
+ */
+ const mandatoryDeploymentParameters = [
+ "trustedSequencerURL",
+ "networkName",
+ "trustedSequencer",
+ "chainID",
+ "rollupAdminAddress",
+ "consensusContractName",
+ "rollupManagerAddress",
+ "rollupTypeId",
+ "gasTokenAddress",
+ "type",
+ ];
+ // check create rollup type
+ switch (createRollupParameters.type) {
+ case transactionTypes.EOA:
+ case transactionTypes.MULTISIG:
+ break;
+ case transactionTypes.TIMELOCK:
+ mandatoryDeploymentParameters.push("timelockDelay");
+ break;
+ default:
+ throw new Error(`Invalid type ${createRollupParameters.type}`);
+ }
+ for (const parameterName of mandatoryDeploymentParameters) {
+ if (createRollupParameters[parameterName] === undefined || createRollupParameters[parameterName] === "") {
+ throw new Error(`Missing parameter: ${parameterName}`);
+ }
+ }
+
+ const {
+ trustedSequencerURL,
+ networkName,
+ trustedSequencer,
+ chainID,
+ rollupAdminAddress,
+ consensusContractName,
+ isVanillaClient,
+ sovereignParams,
+ } = createRollupParameters;
+
+ // Check supported consensus is correct
+ const supportedConsensus = [
+ ConsensusContracts.PolygonZkEVMEtrog,
+ ConsensusContracts.PolygonValidiumEtrog,
+ ConsensusContracts.PolygonPessimisticConsensus,
+ ];
+
+ if (!supportedConsensus.includes(consensusContractName)) {
+ throw new Error(
+ `Consensus contract ${consensusContractName} not supported, supported contracts are: ${supportedConsensus}`
+ );
+ }
+
+ // Check consensus compatibility
+ if (isVanillaClient) {
+ if (consensusContractName !== "PolygonPessimisticConsensus") {
+ throw new Error(`Vanilla client only supports PolygonPessimisticConsensus`);
+ }
+ // Check sovereign params
+ const mandatorySovereignParams = [
+ "bridgeManager",
+ "sovereignWETHAddress",
+ "sovereignWETHAddressIsNotMintable",
+ "globalExitRootUpdater",
+ "globalExitRootRemover",
+ ];
+ for (const parameterName of mandatorySovereignParams) {
+ if (typeof sovereignParams[parameterName] === undefined || sovereignParams[parameterName] === "") {
+ throw new Error(`Missing sovereign parameter: ${parameterName}`);
+ }
+ }
+ // Vanilla checks like in bridge contract
+ if (
+ ethers.isAddress(createRollupParameters.gasTokenAddress) &&
+ createRollupParameters.gasTokenAddress !== ethers.ZeroAddress &&
+ sovereignParams.sovereignWETHAddress === ethers.ZeroAddress &&
+ sovereignParams.sovereignWETHAddressIsNotMintable === true
+ ) {
+ throw new Error(
+ "InvalidSovereignWETHAddressParams: if gasTokenAddress is not 0x0, and sovereignWETHAddress is 0x0, sovereignWETHAddressIsNotMintable must be false"
+ );
+ }
+
+ if (
+ createRollupParameters.gasTokenAddress === ethers.ZeroAddress &&
+ (sovereignParams.sovereignWETHAddress !== ethers.ZeroAddress ||
+ sovereignParams.sovereignWETHAddressIsNotMintable === true)
+ ) {
+ throw new Error(
+ "InvalidSovereignWETHAddressParams: If gasTokenAddress is 0x0, sovereignWETHAddress must be 0x0 and sovereignWETHAddressIsNotMintable must be false"
+ );
+ }
+ }
+
+ // Load provider
+ let currentProvider = ethers.provider;
+ if (createRollupParameters.multiplierGas || createRollupParameters.maxFeePerGas) {
+ if (process.env.HARDHAT_NETWORK !== "hardhat") {
+ currentProvider = ethers.getDefaultProvider(
+ `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
+ ) as any;
+ if (createRollupParameters.maxPriorityFeePerGas && createRollupParameters.maxFeePerGas) {
+ console.log(
+ `Hardcoded gas used: MaxPriority${createRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${createRollupParameters.maxFeePerGas} gwei`
+ );
+ const FEE_DATA = new ethers.FeeData(
+ null,
+ ethers.parseUnits(createRollupParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(createRollupParameters.maxPriorityFeePerGas, "gwei")
+ );
+
+ currentProvider.getFeeData = async () => FEE_DATA;
+ } else {
+ console.log("Multiplier gas used: ", createRollupParameters.multiplierGas);
+ async function overrideFeeData() {
+ const feeData = await ethers.provider.getFeeData();
+ return new ethers.FeeData(
+ null,
+ ((feeData.maxFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) / 1000n,
+ ((feeData.maxPriorityFeePerGas as bigint) * BigInt(createRollupParameters.multiplierGas)) /
+ 1000n
+ );
+ }
+ currentProvider.getFeeData = overrideFeeData;
+ }
+ }
+ }
+
+ // Load deployer
+ let deployer;
+ if (createRollupParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(createRollupParameters.deployerPvtKey, currentProvider);
+ } else if (process.env.MNEMONIC) {
+ deployer = ethers.HDNodeWallet.fromMnemonic(
+ ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
+ "m/44'/60'/0'/0/0"
+ ).connect(currentProvider);
+ } else {
+ [deployer] = await ethers.getSigners();
+ }
+
+ // Load Rollup manager
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
+ createRollupParameters.rollupManagerAddress
+ ) as PolygonRollupManager;
+
+ // Load global exit root manager
+ const globalExitRootManagerFactory = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer);
+ const globalExitRootManagerAddress = await rollupManagerContract.globalExitRootManager();
+ const globalExitRootManagerContract = globalExitRootManagerFactory.attach(
+ globalExitRootManagerAddress
+ ) as PolygonRollupManager;
+
+ // Check if the deployer has right to deploy new rollups from rollupManager contract
+ const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
+ if ((await rollupManagerContract.hasRole(DEFAULT_ADMIN_ROLE, deployer.address)) == false) {
+ throw new Error(
+ `Deployer does not have admin role. Use the test flag on deploy_parameters if this is a test deployment`
+ );
+ }
+ const polygonConsensusFactory = (await ethers.getContractFactory(consensusContractName, deployer)) as any;
+ // Check chainID
+ let rollupID = await rollupManagerContract.chainIDToRollupID(chainID);
+ if (Number(rollupID) !== 0) {
+ throw new Error(`Rollup with chainID ${chainID} already exists`);
+ }
+ // Check rollupTypeId
+ const rollupType = await rollupManagerContract.rollupTypeMap(createRollupParameters.rollupTypeId);
+ const consensusContractAddress = rollupType[0];
+ const verifierType = Number(rollupType[3]);
+ if (
+ consensusContractName === ConsensusContracts.PolygonPessimisticConsensus &&
+ verifierType !== VerifierType.Pessimistic
+ ) {
+ throw new Error(
+ `Mismatch RollupTypeID: Verifier type should be ${VerifierType.StateTransition} for ${consensusContractName}`
+ );
+ }
+ if (consensusContractName !== ConsensusContracts.PolygonPessimisticConsensus) {
+ if (verifierType !== VerifierType.StateTransition) {
+ throw new Error(
+ `Mismatch RollupTypeID: Verifier type should be ${VerifierType.Pessimistic} for ${consensusContractName}`
+ );
+ }
+ const polygonValidiumConsensusFactory = (await ethers.getContractFactory(
+ ConsensusContracts.PolygonValidiumEtrog,
+ deployer
+ )) as any;
+ const polygonValidiumConsensusContract = polygonValidiumConsensusFactory.attach(
+ consensusContractAddress
+ ) as PolygonValidiumEtrog;
+
+ let hasMethodImplemented;
+
+ try {
+ hasMethodImplemented = await polygonValidiumConsensusContract.isSequenceWithDataAvailabilityAllowed();
+ } catch (error) {
+ console.log("RollupTypeID selected ");
+ }
+
+ // Consensus PolygonZkEVMEtrog: if 'hasMethodImplemented' does not have any value
+ if (typeof hasMethodImplemented === "undefined") {
+ if (consensusContractName === ConsensusContracts.PolygonValidiumEtrog) {
+ throw new Error(
+ `The consensus contract at ${consensusContractAddress} does not have the public method "isSequenceWithDataAvailabilityAllowed", this means is a rollup and you are trying to create a validium`
+ );
+ }
+ } else {
+ // Consensus PolygonValidiumEtrog: if 'hasMethodImplemented' does not have any value
+ if (consensusContractName === ConsensusContracts.PolygonZkEVMEtrog) {
+ throw new Error(
+ `The consensus contract at ${consensusContractAddress} does have the public var "isSequenceWithDataAvailabilityAllowed", this means is a validium and you are trying to create a rollup`
+ );
+ }
+ }
+ }
+
+ // Grant role CREATE_ROLLUP_ROLE to deployer
+ const CREATE_ROLLUP_ROLE = ethers.id("CREATE_ROLLUP_ROLE");
+ if ((await rollupManagerContract.hasRole(CREATE_ROLLUP_ROLE, deployer.address)) == false)
+ await rollupManagerContract.grantRole(CREATE_ROLLUP_ROLE, deployer.address);
+
+ // Get rollup address deterministically
+ const nonce = await currentProvider.getTransactionCount(rollupManagerContract.target);
+ const createdRollupAddress = ethers.getCreateAddress({
+ from: rollupManagerContract.target as string,
+ nonce: nonce,
+ });
+ let globalExitRoot = "";
+ let batchData = {};
+ // Populate output json
+ outputJson.consensusContractName = consensusContractName;
+ outputJson.rollupAddress = createdRollupAddress;
+ outputJson.genesis = rollupType.genesis;
+ outputJson.gasTokenAddress = createRollupParameters.gasTokenAddress;
+ outputJson.rollupManagerAddress = createRollupParameters.rollupManagerAddress;
+ if (createRollupParameters.type === transactionTypes.TIMELOCK) {
+ console.log("Creating timelock txs for rollup creation...");
+ const salt = createRollupParameters.timelockSalt || ethers.ZeroHash;
+ const predecessor = ethers.ZeroHash;
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+ const operation = genOperation(
+ createRollupParameters.rollupManagerAddress,
+ 0, // value
+ PolygonRollupManagerFactory.interface.encodeFunctionData("createNewRollup", [
+ createRollupParameters.rollupTypeId,
+ chainID,
+ rollupAdminAddress,
+ trustedSequencer,
+ createRollupParameters.gasTokenAddress,
+ trustedSequencerURL,
+ networkName,
+ ]),
+ predecessor, // predecessor
+ salt // salt
+ );
+ // Schedule operation
+ const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [
+ operation.target,
+ operation.value,
+ operation.data,
+ operation.predecessor,
+ operation.salt,
+ createRollupParameters.timelockDelay,
+ ]);
+ // Execute operation
+ const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [
+ operation.target,
+ operation.value,
+ operation.data,
+ operation.predecessor,
+ operation.salt,
+ ]);
+ console.log({scheduleData});
+ console.log({executeData});
+ outputJson.scheduleData = scheduleData;
+ outputJson.executeData = executeData;
+ // Decode the scheduleData for better readability
+ const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
+ const paramsArray = timelockTx?.fragment.inputs;
+ const objectDecoded = {};
+ for (let i = 0; i < paramsArray?.length; i++) {
+ const currentParam = paramsArray[i];
+
+ objectDecoded[currentParam.name] = timelockTx?.args[i];
+
+ if (currentParam.name == "data") {
+ const decodedRollupManagerData = PolygonRollupManagerFactory.interface.parseTransaction({
+ data: timelockTx?.args[i],
+ });
+ const objectDecodedData = {};
+ const paramsArrayData = decodedRollupManagerData?.fragment.inputs;
+
+ for (let j = 0; j < paramsArrayData?.length; j++) {
+ const currentParam = paramsArrayData[j];
+ objectDecodedData[currentParam.name] = decodedRollupManagerData?.args[j];
+ }
+ objectDecoded["decodedData"] = objectDecodedData;
+ }
+ }
+
+ outputJson.decodedScheduleData = convertBigIntsToNumbers(objectDecoded);
+ fs.writeFileSync(destPath, JSON.stringify(outputJson, null, 1));
+ console.log("Finished script, output saved at: ", destPath);
+ process.exit(0);
+ } else if (createRollupParameters.type === transactionTypes.MULTISIG) {
+ console.log("Creating calldata for rollup creation from multisig...");
+ const txDeployRollupCalldata = PolygonRollupManagerFactory.interface.encodeFunctionData("createNewRollup", [
+ createRollupParameters.rollupTypeId,
+ chainID,
+ rollupAdminAddress,
+ trustedSequencer,
+ createRollupParameters.gasTokenAddress,
+ trustedSequencerURL,
+ networkName,
+ ]);
+ outputJson.txDeployRollupCalldata = txDeployRollupCalldata;
+ fs.writeFileSync(destPath, JSON.stringify(outputJson, null, 1));
+ console.log("Finished script, output saved at: ", destPath);
+ process.exit(0);
+ } else {
+ console.log("Deploying rollup....");
+ // Create new rollup
+ const txDeployRollup = await rollupManagerContract.createNewRollup(
+ createRollupParameters.rollupTypeId,
+ chainID,
+ rollupAdminAddress,
+ trustedSequencer,
+ createRollupParameters.gasTokenAddress,
+ trustedSequencerURL,
+ networkName
+ );
+
+ const receipt = (await txDeployRollup.wait()) as any;
+ const blockDeploymentRollup = await receipt?.getBlock();
+
+ batchData = {
+ timestamp: blockDeploymentRollup.timestamp,
+ l1BlockNumber: blockDeploymentRollup.number,
+ l1BlockHash: blockDeploymentRollup.hash,
+ l1ParentHash: blockDeploymentRollup.parentHash,
+ };
+ outputJson.createRollupBlockNumber = blockDeploymentRollup.number;
+ console.log("#######################\n");
+ console.log(
+ `Created new ${consensusContractName} Rollup: ${createdRollupAddress} with rollupTypeId: ${createRollupParameters.rollupTypeId}`
+ );
+
+ // Search added global exit root on the logs
+ for (const log of receipt?.logs) {
+ if (log.address == createdRollupAddress) {
+ const parsedLog = polygonConsensusFactory.interface.parseLog(log);
+ if (parsedLog != null && parsedLog.name == "InitialSequenceBatches") {
+ globalExitRoot = parsedLog.args.lastGlobalExitRoot;
+ }
+ }
+ }
+ // Assert admin address
+ expect(await upgrades.erc1967.getAdminAddress(createdRollupAddress)).to.be.equal(rollupManagerContract.target);
+ expect(await upgrades.erc1967.getImplementationAddress(createdRollupAddress)).to.be.equal(
+ consensusContractAddress
+ );
+ }
+ // Update rollupId
+ rollupID = await rollupManagerContract.chainIDToRollupID(chainID);
+
+ // If is a validium, data committee must be set up
+ const dataAvailabilityProtocol = createRollupParameters.dataAvailabilityProtocol || "PolygonDataCommittee";
+ if (consensusContractName.includes("PolygonValidiumEtrog") && dataAvailabilityProtocol === "PolygonDataCommittee") {
+ console.log("Is a validium, setting up data committee...");
+ // deploy data committee
+ const PolygonDataCommitteeContract = (await ethers.getContractFactory("PolygonDataCommittee", deployer)) as any;
+ let polygonDataCommittee = await upgrades.deployProxy(PolygonDataCommitteeContract, [], {
+ unsafeAllow: ["constructor"],
+ });
+ await polygonDataCommittee?.waitForDeployment();
+ console.log(`Deployed PolygonDataCommittee at ${polygonDataCommittee?.address}`);
+ // Load data committee
+ const PolygonValidiumContract = (await polygonConsensusFactory.attach(
+ createdRollupAddress
+ )) as PolygonValidiumEtrog;
+ // add data committee to the consensus contract
+ if ((await PolygonValidiumContract.admin()) == deployer.address) {
+ await (
+ await PolygonValidiumContract.setDataAvailabilityProtocol(polygonDataCommittee?.target as any)
+ ).wait();
+ } else {
+ console.log("Is a validium, setting up data committee...");
+ await (await polygonDataCommittee?.transferOwnership(rollupAdminAddress)).wait();
+ console.log(`Transferred ownership of PolygonDataCommittee to ${rollupAdminAddress}`);
+ }
+ outputJson.polygonDataCommitteeAddress = polygonDataCommittee?.target;
+ }
+
+ let gasTokenAddress, gasTokenNetwork, gasTokenMetadata;
+
+ // Get bridge instance
+ const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2", deployer);
+ const bridgeContractAddress = await rollupManagerContract.bridgeAddress();
+ const rollupBridgeContract = bridgeFactory.attach(bridgeContractAddress) as PolygonZkEVMBridgeV2;
+ if (
+ ethers.isAddress(createRollupParameters.gasTokenAddress) &&
+ createRollupParameters.gasTokenAddress !== ethers.ZeroAddress
+ ) {
+ // Get token metadata
+ gasTokenMetadata = await rollupBridgeContract.getTokenMetadata(createRollupParameters.gasTokenAddress);
+ outputJson.gasTokenMetadata = gasTokenMetadata;
+ // If gas token metadata includes `0x124e4f545f56414c49445f454e434f44494e47 (NOT_VALID_ENCODING)` means there is no erc20 token deployed at the selected gas token network
+ if (gasTokenMetadata.includes("124e4f545f56414c49445f454e434f44494e47")) {
+ throw new Error(
+ `Invalid gas token address, no ERC20 token deployed at the selected gas token network ${createRollupParameters.gasTokenAddress}`
+ );
+ }
+ const wrappedData = await rollupBridgeContract.wrappedTokenToTokenInfo(createRollupParameters.gasTokenAddress);
+ if (wrappedData.originNetwork != 0n) {
+ // Wrapped token
+ gasTokenAddress = wrappedData.originTokenAddress;
+ gasTokenNetwork = wrappedData.originNetwork;
+ } else {
+ // Mainnet token
+ gasTokenAddress = createRollupParameters.gasTokenAddress;
+ gasTokenNetwork = 0n;
+ }
+ } else {
+ gasTokenAddress = ethers.ZeroAddress;
+ gasTokenNetwork = 0;
+ gasTokenMetadata = "0x";
+ }
+
+ /**
+ If the system is running a "vanilla client" (i.e., a basic, unmodified Ethereum client or rollup setup), the genesis block should include the deployment of the sovereign contracts, and these contracts should already be initialized with their required initial state and configurations. This means that the genesis block will contain the initial state for these contracts, allowing the system to start running without needing any additional initialization steps. However, for other rollups, additional configuration is needed. In this case, instead of having everything pre-initialized in the genesis block, we must inject an "initialization batch" into the genesis file. This batch will contain specific instructions for initializing the contracts at the time of rollup deployment. The injected initialization batch allows the system to be configured dynamically during deployment.
+ */
+
+ if (isVanillaClient) {
+ console.log("Vanilla client detected, updating genesis...");
+ const pathGenesis = path.join(__dirname, "./genesis.json");
+ let genesis = JSON.parse(fs.readFileSync(pathGenesis, "utf8"));
+ const initializeParams = {
+ rollupID: rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ polygonRollupManager: ethers.ZeroAddress,
+ gasTokenMetadata,
+ bridgeManager: sovereignParams.bridgeManager,
+ sovereignWETHAddress: sovereignParams.sovereignWETHAddress,
+ sovereignWETHAddressIsNotMintable: sovereignParams.sovereignWETHAddressIsNotMintable,
+ globalExitRootUpdater: sovereignParams.globalExitRootUpdater,
+ globalExitRootRemover: sovereignParams.globalExitRootRemover,
+ };
+ genesis = await updateVanillaGenesis(genesis, chainID, initializeParams);
+ // Add weth address to deployment output if gas token address is provided and sovereignWETHAddress is not provided
+ if (
+ gasTokenAddress !== ethers.ZeroAddress &&
+ ethers.isAddress(gasTokenAddress) &&
+ (sovereignParams.sovereignWETHAddress === ethers.ZeroAddress ||
+ !ethers.isAddress(sovereignParams.sovereignWETHAddress))
+ ) {
+ console.log("Rollup with custom gas token, adding WETH address to deployment output...");
+ const wethObject = genesis.genesis.find(function (obj: {contractName: string}) {
+ return obj.contractName == "WETH";
+ });
+ outputJson.WETHAddress = wethObject.address;
+ }
+ outputJson.genesis_sovereign = genesis;
+ } else {
+ if (consensusContractName === "PolygonPessimisticConsensus") {
+ console.log("Pessimistic rollup detected, injecting initialization batch...");
+ // Add the first batch of the created rollup
+ const newPessimisticRollup = (await polygonConsensusFactory.attach(
+ createdRollupAddress
+ )) as PolygonPessimisticConsensus;
+
+ // Get last GER
+ const lastGER = await globalExitRootManagerContract.getLastGlobalExitRoot();
+
+ const dataInjectedTx = await rollupBridgeContract.interface.encodeFunctionData("initialize", [
+ rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ Constants.ADDRESS_GLOBAL_EXIT_ROOT_MANAGER_L2, // Global exit root address on L2
+ ethers.ZeroAddress, // Rollup manager on L2 does not exist
+ gasTokenMetadata as any,
+ ]);
+
+ // check maximum length is 65535
+ if ((dataInjectedTx.length - 2) / 2 > 0xffff) {
+ // throw error
+ throw new Error(`HugeTokenMetadataNotSupported`);
+ }
+
+ const injectedTx = {
+ type: 0, // force ethers to parse it as a legacy transaction
+ chainId: 0, // force ethers to parse it as a pre-EIP155 transaction
+ to: await newPessimisticRollup.bridgeAddress(),
+ value: 0,
+ gasPrice: 0,
+ gasLimit: 30000000,
+ nonce: 0,
+ data: dataInjectedTx,
+ signature: {
+ v: "0x1b",
+ r: "0x00000000000000000000000000000000000000000000000000000005ca1ab1e0",
+ s: "0x000000000000000000000000000000000000000000000000000000005ca1ab1e",
+ },
+ };
+
+ // serialize transactions
+ const txObject = ethers.Transaction.from(injectedTx);
+
+ const customData = processorUtils.rawTxToCustomRawTx(txObject.serialized);
+ batchData = Object.assign(batchData, {
+ batchL2Data: customData,
+ globalExitRoot: lastGER,
+ sequencer: trustedSequencer,
+ });
+ } else {
+ console.log("Setting initialization batch for the rollup...");
+ // Add the first batch of the created rollup
+ const newRollupContract = (await polygonConsensusFactory.attach(createdRollupAddress)) as PolygonZkEVMEtrog;
+ batchData = Object.assign(batchData, {
+ batchL2Data: await newRollupContract.generateInitializeTransaction(
+ Number(rollupID),
+ gasTokenAddress,
+ gasTokenNetwork,
+ gasTokenMetadata as any
+ ),
+ globalExitRoot: globalExitRoot,
+ sequencer: trustedSequencer,
+ });
+ }
+ }
+ outputJson.firstBatchData = batchData;
+ outputJson.rollupID = Number(rollupID);
+
+ fs.writeFileSync(destPath, JSON.stringify(outputJson, null, 1));
+ console.log("Finished script, output saved at: ", destPath);
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
diff --git a/tools/createNewRollup/create_new_rollup.json.example b/tools/createNewRollup/create_new_rollup.json.example
new file mode 100644
index 000000000..6528a9361
--- /dev/null
+++ b/tools/createNewRollup/create_new_rollup.json.example
@@ -0,0 +1,26 @@
+{
+ "type":"EOA",
+ "trustedSequencerURL": "http://zkevm-json-rpc:8123",
+ "networkName": "zkevm",
+ "trustedSequencer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "chainID": 1001,
+ "rollupAdminAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "consensusContractName": "PolygonZkEVMEtrog",
+ "gasTokenAddress": "0x0000000000000000000000000000000000000000",
+ "deployerPvtKey": "",
+ "maxFeePerGas": "",
+ "maxPriorityFeePerGas": "",
+ "multiplierGas": "",
+ "timelockDelay": 0,
+ "timelockSalt": "",
+ "rollupManagerAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0",
+ "rollupTypeId": 1,
+ "isVanillaClient": false,
+ "sovereignParams": {
+ "bridgeManager": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "sovereignWETHAddress": "0x0000000000000000000000000000000000000000",
+ "sovereignWETHAddressIsNotMintable": false,
+ "globalExitRootUpdater": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "globalExitRootRemover": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
+ }
+}
\ No newline at end of file
diff --git a/tools/createNewRollup/genesis.json.example b/tools/createNewRollup/genesis.json.example
new file mode 100644
index 000000000..b9567ecbb
--- /dev/null
+++ b/tools/createNewRollup/genesis.json.example
@@ -0,0 +1,92 @@
+{
+ "root": "0x433ba1f86d65cf39d003f7dec3c6dcdbf14b17c169fba89a16732b88254a3b1e",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridgeV2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBC9585CB224A8F42EF9C9F0b99c531B450b11886",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612e6f565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004612ef6565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190612fb8565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb366004612fd1565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004612ffa565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc366004613074565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f3660046130ba565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a36104573660046130e2565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b506102426104953660046131e3565b610aa8565b3480156104a5575f80fd5b506102216104b4366004613279565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b50610281610517366004612fd1565b610c79565b348015610527575f80fd5b506101f86105363660046132f7565b610cbe565b348015610546575f80fd5b50610221610555366004613328565b610d46565b61022161056836600461340c565b611181565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161154a565b3480156105b4575f80fd5b506102a36105c33660046130ba565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613328565b61157d565b3480156105fe575f80fd5b5061022161060d36600461349c565b6117f9565b34801561061d575f80fd5b506101f861062c36600461353f565b611b14565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611b2b565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611b86565b5050505050565b606e805461076690613584565b80601f016020809104026020016040519081016040528092919081815260200182805461079290613584565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c26135bc565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b60408051602081018490529081018390526060016040516020818303038152906040528051906020012091508080610959906135e4565b915050610898565b50919392505050565b5f61098b848461097985611c50565b61098286611d3a565b61049587611e1b565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664611ee8565b60405180611ba00160405280611b668152602001613c36611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a056135bc565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a556135bc565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a97816135e4565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613c36611b669139898989604051602001610b30939291906135fc565b60408051601f1981840301815290829052610b4e9291602001613634565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54610c63906001600160a01b031685611f96565b610c71868686868686611b86565b505050505050565b6060610c8482611c50565b610c8d83611d3a565b610c9684611e1b565b604051602001610ca8939291906135fc565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610ce3575063ffffffff83166001145b15610cf5575063ffffffff8316610d1d565b610d0a64010000000063ffffffff8516613662565b610d1a9063ffffffff8616613679565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610d6a57604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d9a576040516302caf51760e11b815260040160405180910390fd5b610dcd8c8c8c8c8c610dc85f8e8e8e8e8e8e8e604051610dbb92919061368c565b60405180910390206107e5565b612006565b6001600160a01b038616610ecd57606f546001600160a01b0316610eb1575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e23576020820181803683370190505b50604051610e31919061369b565b5f6040518083038185875af1925050503d805f8114610e6b576040519150601f19603f3d011682016040523d82523d5f602084013e610e70565b606091505b5050905080610eab576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611117565b606f54610ec8906001600160a01b03168585612198565b611117565b606d546001600160a01b038781169116148015610efb5750606d5463ffffffff888116600160a01b90920416145b15610f12575f6001600160a01b0385168482610df9565b60685463ffffffff610100909104811690881603610f3e57610ec86001600160a01b038716858561220a565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b031680611109575f610fe88386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061228b92505050565b9050610ff5818888612198565b80606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516110fb9594939291906136de565b60405180910390a150611114565b611114818787612198565b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156111a557604051630bc011ff60e21b815260040160405180910390fd5b6111ad61231e565b60685463ffffffff6101009091048116908816036111de576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b0388166112da5788341461122a576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff1694509061125790613584565b80601f016020809104026020016040519081016040528092919081815260200182805461128390613584565b80156112ce5780601f106112a5576101008083540402835291602001916112ce565b820191905f5260205f20905b8154815290600101906020018083116112b157829003601f168201915b505050505091506114c1565b3415611312576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b039081169089160361133757611332888a611f96565b6114c1565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561139757611386898b611f96565b6020810151815190955093506114b4565b85156113a9576113a9898b8989612377565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156113ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114119190613716565b90506114286001600160a01b038b1633308e612716565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561146c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114909190613716565b905061149c828261372d565b6068548c9850610100900463ffffffff169650935050505b6114bd89610c79565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e8688605354604051611500989796959493929190613740565b60405180910390a16115266115215f85878f8f8789805190602001206107e5565b612767565b861561153457611534611ee8565b5050505061154160018055565b50505050505050565b606c546001600160a01b0316331461157557604051631736745960e31b815260040160405180910390fd5b610664612868565b60685460ff16156115a157604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146115d1576040516302caf51760e11b815260040160405180910390fd5b6115f38c8c8c8c8c610dc860018e8e8e8e8e8e8e604051610dbb92919061368c565b606f545f906001600160a01b03166116a657846001600160a01b031684888a868660405160240161162794939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161165c919061369b565b5f6040518083038185875af1925050503d805f8114611696576040519150601f19603f3d011682016040523d82523d5f602084013e61169b565b606091505b505080915050611757565b606f546116bd906001600160a01b03168686612198565b846001600160a01b0316878985856040516024016116de94939291906137a9565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b17905251611713919061369b565b5f604051808303815f865af19150503d805f811461174c576040519150601f19603f3d011682016040523d82523d5f602084013e611751565b606091505b50909150505b8061178e576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff161580801561181757505f54600160ff909116105b806118305750303b15801561183057505f5460ff166001145b6118a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff1916600117905580156118c8575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff191685831617905586166119a35763ffffffff85161561199e576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611abf565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e6119f28382613826565b50611a915f801b6012604051602001611a7d91906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b60405160208183030381529060405261228b565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611ac76128d8565b8015611541575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611b218686866109d3565b1495945050505050565b60685460ff1615611b4f57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611bb7576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c0b999897969594939291906138e2565b60405180910390a1611c426115216001606860019054906101000a900463ffffffff16338a8a8a8989604051610dbb92919061368c565b8215610c7157610c71611ee8565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611caf919061369b565b5f60405180830381855afa9150503d805f8114611ce7576040519150601f19603f3d011682016040523d82523d5f602084013e611cec565b606091505b509150915081611d31576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b8161294a565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611d99919061369b565b5f60405180830381855afa9150503d805f8114611dd1576040519150601f19603f3d011682016040523d82523d5f602084013e611dd6565b606091505b509150915081611d31576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b03861691611e79919061369b565b5f60405180830381855afa9150503d805f8114611eb1576040519150601f19603f3d011682016040523d82523d5f602084013e611eb6565b606091505b5091509150818015611ec9575080516020145b611ed457601261098b565b8080602001905181019061098b919061394d565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d611f4961088e565b6040518263ffffffff1660e01b8152600401611f6791815260200190565b5f604051808303815f87803b158015611f7e575f80fd5b505af1158015611f90573d5f803e3d5ffd5b50505050565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152336004820152602481018290526001600160a01b03831690639dc29fac906044015f604051808303815f87803b158015611ff4575f80fd5b505af1158015610c71573d5f803e3d5ffd5b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190613716565b9050805f036120f5576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806801000000000000000087161561213957869150612117848a8489611b14565b612134576040516338105f3b60e21b815260040160405180910390fd5b612183565b602087901c612149816001613968565b915087925061216461215c868c866109d3565b8a8389611b14565b612181576040516338105f3b60e21b815260040160405180910390fd5b505b61218d8282612b1a565b505050505050505050565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018390528416906340c10f19906044015f604051808303815f87803b1580156121f8575f80fd5b505af1158015611541573d5f803e3d5ffd5b6040516001600160a01b0383166024820152604481018290526122869084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bda565b505050565b5f8060405180611ba00160405280611b668152602001613c36611b669139836040516020016122bb929190613634565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612317576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036123705760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161189e565b6002600155565b5f6123856004828486613985565b61238e916139ac565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b0319821601612568575f8080808080806123d5896004818d613985565b8101906123e291906139dc565b9650965096509650965096509650336001600160a01b0316876001600160a01b0316146124225760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038616301461244b5760405163750643af60e01b815260040160405180910390fd5b8a8514612484576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161251b919061369b565b5f604051808303815f865af19150503d805f8114612554576040519150601f19603f3d011682016040523d82523d5f602084013e612559565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146125b2576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806125c78a6004818e613985565b8101906125d49190613a2b565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146126165760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b038716301461263f5760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916126c6919061369b565b5f604051808303815f865af19150503d805f81146126ff576040519150601f19603f3d011682016040523d82523d5f602084013e612704565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f909085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161224f565b80600161277660206002613b89565b612780919061372d565b605354106127ba576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546127c9906135e4565b918290555090505f5b6020811015612859578082901c6001166001036128055782603382602081106127fd576127fd6135bc565b015550505050565b60338160208110612818576128186135bc565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092508080612851906135e4565b9150506127d2565b50612286613b94565b60018055565b60685460ff166128a4576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff166129425760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b610664612cbe565b6060604082511061296957818060200190518101906106ca9190613ba8565b8151602003612adc575f5b6020811080156129bb5750828181518110612991576129916135bc565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b156129d257806129ca816135e4565b915050612974565b805f03612a1457505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612a2e57612a2e61311e565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b5090505f5b82811015612ad457848181518110612a7757612a776135bc565b602001015160f81c60f81b828281518110612a9457612a946135bc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612acc816135e4565b915050612a5d565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612b3d575063ffffffff82166001145b15612b4f575063ffffffff8216612b77565b612b6464010000000063ffffffff8416613662565b612b749063ffffffff8516613679565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611541576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612c2e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d289092919063ffffffff16565b8051909150156122865780806020019051810190612c4c9190613c1a565b6122865760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161189e565b5f54610100900460ff166128625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161189e565b606061098b84845f85855f80866001600160a01b03168587604051612d4d919061369b565b5f6040518083038185875af1925050503d805f8114612d87576040519150601f19603f3d011682016040523d82523d5f602084013e612d8c565b606091505b5091509150612d9d87838387612da8565b979650505050505050565b60608315612e165782515f03612e0f576001600160a01b0385163b612e0f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161189e565b508161098b565b61098b8383815115612e2b5781518083602001fd5b8060405162461bcd60e51b815260040161189e9190612fb8565b803563ffffffff81168114612b15575f80fd5b6001600160a01b0381168114612e6c575f80fd5b50565b5f8060408385031215612e80575f80fd5b612e8983612e45565b91506020830135612e9981612e58565b809150509250929050565b8015158114612e6c575f80fd5b5f8083601f840112612ec1575f80fd5b50813567ffffffffffffffff811115612ed8575f80fd5b602083019150836020828501011115612eef575f80fd5b9250929050565b5f805f805f60808688031215612f0a575f80fd5b612f1386612e45565b94506020860135612f2381612e58565b93506040860135612f3381612ea4565b9250606086013567ffffffffffffffff811115612f4e575f80fd5b612f5a88828901612eb1565b969995985093965092949392505050565b5f5b83811015612f85578181015183820152602001612f6d565b50505f910152565b5f8151808452612fa4816020860160208601612f6b565b601f01601f19169290920160200192915050565b602081525f612fca6020830184612f8d565b9392505050565b5f60208284031215612fe1575f80fd5b8135612fca81612e58565b60ff81168114612e6c575f80fd5b5f805f805f805f60e0888a031215613010575f80fd5b873561301b81612fec565b965061302960208901612e45565b9550604088013561303981612e58565b945061304760608901612e45565b9350608088013561305781612e58565b9699959850939692959460a0840135945060c09093013592915050565b5f805f60608486031215613086575f80fd5b61308f84612e45565b9250602084013561309f81612e58565b915060408401356130af81612e58565b809150509250925092565b5f602082840312156130ca575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f61044084860312156130f5575f80fd5b8335925061310685602086016130d1565b91506131156104208501612e45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561315b5761315b61311e565b604052919050565b5f67ffffffffffffffff82111561317c5761317c61311e565b50601f01601f191660200190565b5f61319c61319784613163565b613132565b90508281528383830111156131af575f80fd5b828260208301375f602084830101529392505050565b5f82601f8301126131d4575f80fd5b612fca8383356020850161318a565b5f805f805f60a086880312156131f7575f80fd5b61320086612e45565b9450602086013561321081612e58565b9350604086013567ffffffffffffffff8082111561322c575f80fd5b61323889838a016131c5565b9450606088013591508082111561324d575f80fd5b5061325a888289016131c5565b925050608086013561326b81612fec565b809150509295509295909350565b5f805f805f8060a0878903121561328e575f80fd5b61329787612e45565b955060208701356132a781612e58565b94506040870135935060608701356132be81612ea4565b9250608087013567ffffffffffffffff8111156132d9575f80fd5b6132e589828a01612eb1565b979a9699509497509295939492505050565b5f8060408385031215613308575f80fd5b61331183612e45565b915061331f60208401612e45565b90509250929050565b5f805f805f805f805f805f806109208d8f031215613344575f80fd5b61334e8e8e6130d1565b9b5061335e8e6104008f016130d1565b9a506108008d013599506108208d013598506108408d013597506133856108608e01612e45565b96506133956108808e0135612e58565b6108808d013595506133aa6108a08e01612e45565b94506133ba6108c08e0135612e58565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e013511156133e3575f80fd5b6133f48e6109008f01358f01612eb1565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a031215613422575f80fd5b61342b88612e45565b9650602088013561343b81612e58565b955060408801359450606088013561345281612e58565b9350608088013561346281612ea4565b925060a088013567ffffffffffffffff81111561347d575f80fd5b6134898a828b01612eb1565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156134b1575f80fd5b6134ba87612e45565b955060208701356134ca81612e58565b94506134d860408801612e45565b935060608701356134e881612e58565b925060808701356134f881612e58565b915060a087013567ffffffffffffffff811115613513575f80fd5b8701601f81018913613523575f80fd5b6135328982356020840161318a565b9150509295509295509295565b5f805f806104608587031215613553575f80fd5b8435935061356486602087016130d1565b92506135736104208601612e45565b939692955092936104400135925050565b600181811c9082168061359857607f821691505b6020821081036135b657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016135f5576135f56135d0565b5060010190565b606081525f61360e6060830186612f8d565b82810360208401526136208186612f8d565b91505060ff83166040830152949350505050565b5f8351613645818460208801612f6b565b835190830190613659818360208801612f6b565b01949350505050565b80820281158282048414176106ca576106ca6135d0565b808201808211156106ca576106ca6135d0565b818382375f9101908152919050565b5f82516136ac818460208701612f6b565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612d9d6080830184866136b6565b5f60208284031215613726575f80fd5b5051919050565b818103818111156106ca576106ca6135d0565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c085015261379082850187612f8d565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f6137d76060830184866136b6565b9695505050505050565b601f821115612286575f81815260208120601f850160051c810160208610156138075750805b601f850160051c820191505b81811015610c7157828155600101613813565b815167ffffffffffffffff8111156138405761384061311e565b6138548161384e8454613584565b846137e1565b602080601f831160018114613887575f84156138705750858301515b5f19600386901b1c1916600185901b178555610c71565b5f85815260208120601f198616915b828110156138b557888601518255948401946001909101908401613896565b50858210156138d257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c085015261393382850187896136b6565b925080851660e085015250509a9950505050505050505050565b5f6020828403121561395d575f80fd5b8151612fca81612fec565b63ffffffff818116838216019080821115612317576123176135d0565b5f8085851115613993575f80fd5b8386111561399f575f80fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139d45780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a0312156139f2575f80fd5b87356139fd81612e58565b96506020880135613a0d81612e58565b95506040880135945060608801359350608088013561305781612fec565b5f805f805f805f80610100898b031215613a43575f80fd5b8835613a4e81612e58565b97506020890135613a5e81612e58565b965060408901359550606089013594506080890135613a7c81612ea4565b935060a0890135613a8c81612fec565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613ae357815f1904821115613ac957613ac96135d0565b80851615613ad657918102915b93841c9390800290613aae565b509250929050565b5f82613af9575060016106ca565b81613b0557505f6106ca565b8160018114613b1b5760028114613b2557613b41565b60019150506106ca565b60ff841115613b3657613b366135d0565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613b64575081810a6106ca565b613b6e8383613aa9565b805f1904821115613b8157613b816135d0565b029392505050565b5f612fca8383613aeb565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613bb8575f80fd5b815167ffffffffffffffff811115613bce575f80fd5b8201601f81018413613bde575f80fd5b8051613bec61319782613163565b818152856020838501011115613c00575f80fd5b613c11826020830160208601612f6b565b95945050505050565b5f60208284031215613c2a575f80fd5b8151612fca81612ea456fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220b1fe94b20ec78ba8655e62b6a2f33873bb846d19da5ab9523a4def0b2135654564736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridgeV2 proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0xf93FA1eD44BbbE74855f6FaFD8e7c517F8aa3716",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000bc9585cb224a8f42ef9c9f0b99c531b450b11886"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000f93fa1ed44bbbe74855f6fafd8e7c517f8aa371681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f93fa1ed44bbbe74855f6fafd8e7c517f8aa37161614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea2646970667358221220b0e055b3a526de8b3e41419aba10074521f2fc6fc76f05d25e4055bd2429ed5b64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220af70dfb7a469eaff210674e43170a7e152bbb10571ef60492e6d753b73b32d1a64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10",
+ "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "100000000000000000000000",
+ "nonce": "8",
+ "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tools/createSovereignGenesis/.gitignore b/tools/createSovereignGenesis/.gitignore
new file mode 100644
index 000000000..f13a0cb8b
--- /dev/null
+++ b/tools/createSovereignGenesis/.gitignore
@@ -0,0 +1,4 @@
+genesis-rollupID-*.json
+output-rollupID-*.json
+genesis-base.json
+create-genesis-sovereign-params.json
\ No newline at end of file
diff --git a/tools/createSovereignGenesis/README.md b/tools/createSovereignGenesis/README.md
new file mode 100644
index 000000000..d2d9ed695
--- /dev/null
+++ b/tools/createSovereignGenesis/README.md
@@ -0,0 +1,61 @@
+# Create sovereign genesis
+Script to generate the genesis file for a rollup with `SovereignContracts`. This genesis si aim to be used for chains that are run with vanilla clients.
+This script should be run after the rollup is created, so its `rollupID` and the bridge initialization parameters are known.
+The script does the following:
+- read base genesis file
+- deploy sovereign cobtracts
+- initialize them
+
+## Setup
+- install packages
+```
+npm i
+```
+
+- Set env variables
+````
+cp .env.example .env
+````
+
+Fill `.env` with your `INFURA_PROJECT_ID` and `ETHERSCAN_API_KEY`
+
+- Copy configuration files:
+```
+cp ./tools/createSovereignGenesis/create-genesis-sovereign-params.json.example ./tools/createSovereignGenesis/create-genesis-sovereign-params.json
+```
+
+- Copy genesis base file:
+```
+cp ./tools/createSovereignGenesis/genesis-base.json.example ./tools/createSovereignGenesis/genesis-base.json
+```
+
+- Set your parameters
+ - `rollupManagerAddress`: `polygonRollupManager` smart contract address
+ - `rollupID`: Rollup identifier. Assigned to a rollup when it is created in the contracts
+ - `chainID`: ChainID of the rollup
+ - `gasTokenAddress`: Address of the native gas token of the rollup, zero if ether
+ - `bridgeManager`: bridge manager address
+ - `sovereignWETHAddress`: sovereign WETH address
+ - `sovereignWETHAddressIsNotMintable`: Flag to indicate if the wrapped ETH is not mintable
+ - `globalExitRootUpdater`: Address of globalExitRootUpdater for sovereign chains
+ - `globalExitRootRemover`: Address of globalExitRootRemover for sovereign chains
+ - `setPreMintAccount`: indicates if a preMint accounts going to be added
+ - `preMintAccount.address`: ethereum address to receive an initial balance
+ - `preMintAccount.balance`: balance credited to the preminted address
+ - `setTimelockParameters`: indicates if the timelock parameters are going to be changed
+ - `timelockParameters.adminAddress`: address that will have all timelocks roles (ADMIN, PROPOSER, CANCELLER, EXECUTOR)
+ - `timelockParameters.minDelay`: minimum delay set in the timelock smart contract
+- Optional parameters
+ - `format`: choose genesis output format. Supported ones: `geth`
+
+- Run tool:
+```
+npx hardhat run ./tools/createSovereignGenesis/create-sovereign-genesis.ts --network sepolia
+```
+
+### More Info
+- All commands are done from root repository
+- The output files are:
+ - `genesis-rollupID-${rollupID}__${timestamp}`: genesis file
+ - `output-rollupID-${rollupID}__${timestamp}`: input parameters, gastokenAddress information and network used
+- outputs are saved in the tool folder: `./tools/createSovereignGenesis`
\ No newline at end of file
diff --git a/tools/createSovereignGenesis/create-genesis-sovereign-params.json.example b/tools/createSovereignGenesis/create-genesis-sovereign-params.json.example
new file mode 100644
index 000000000..86bbf5bdb
--- /dev/null
+++ b/tools/createSovereignGenesis/create-genesis-sovereign-params.json.example
@@ -0,0 +1,28 @@
+{
+ "rollupManagerAddress": "0xe983fD1798689eee00c0Fb77e79B8f372DF41060",
+ "rollupID": 3,
+ "chainID": 1001,
+ "gasTokenAddress": "0x0000000000000000000000000000000000000000",
+ "bridgeManager": "0x8576158a89648aA88B6036f47B8b74Fc0C2b5c66",
+ "sovereignWETHAddress": "0x0000000000000000000000000000000000000000",
+ "sovereignWETHAddressIsNotMintable": false,
+ "globalExitRootUpdater": "0x8576158a89648aA88B6036f47B8b74Fc0C2b5c66",
+ "globalExitRootRemover": "0x8576158a89648aA88B6036f47B8b74Fc0C2b5c66",
+ "setPreMintAccounts": true,
+ "preMintAccounts": [
+ {
+ "balance": "1000000000000000000",
+ "address": "0x8576158a89648aA88B6036f47B8b74Fc0C2b5c66"
+ },
+ {
+ "balance": "1000000000000000000",
+ "address": "0xb420EAAbFeFA05b39dE520f811325A463E023954"
+ },
+ ],
+ "setTimelockParameters": true,
+ "timelockParameters": {
+ "adminAddress": "0x8576158a89648aA88B6036f47B8b74Fc0C2b5c66",
+ "minDelay": 3600
+ },
+ "formatGenesis": "geth"
+}
\ No newline at end of file
diff --git a/tools/createSovereignGenesis/create-sovereign-genesis.ts b/tools/createSovereignGenesis/create-sovereign-genesis.ts
new file mode 100644
index 000000000..b243c634b
--- /dev/null
+++ b/tools/createSovereignGenesis/create-sovereign-genesis.ts
@@ -0,0 +1,366 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
+// external dependencies
+import path = require("path");
+import fs = require("fs");
+
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../.env")});
+import {ethers, hardhatArguments} from "hardhat";
+
+// internal dependencies
+import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs";
+import updateVanillaGenesis from "../../deployment/v2/utils/updateVanillaGenesis";
+import { PolygonRollupManager, PolygonZkEVMBridgeV2} from "../../typechain-types";
+import "../../deployment/helpers/utils";
+import { initializeTimelockStorage } from "../../src/genesis/genesis-helpers";
+import { checkParams } from '../../src/utils';
+import { logger } from "../../src/logger";
+import { formatGenesis, getGitInfo } from "./helpers";
+import { checkBridgeAddress } from "../utils";
+
+// script utils
+const dateStr = new Date().toISOString();
+
+// read files
+const genesisBase = require("./genesis-base.json");
+const createGenesisSovereignParams = require("./create-genesis-sovereign-params.json");
+
+async function main() {
+ logger.info('Start create-sovereign-genesis tool');
+
+ /////////////////////////////
+ /// CHECK TOOL PARAMS ///
+ /////////////////////////////
+ logger.info('Check initial parameters');
+
+ const mandatoryParameters = [
+ "rollupManagerAddress",
+ "rollupID",
+ "chainID",
+ "bridgeManager",
+ "gasTokenAddress",
+ "sovereignWETHAddress",
+ "sovereignWETHAddressIsNotMintable",
+ "globalExitRootUpdater",
+ "globalExitRootRemover",
+ "setPreMintAccounts",
+ "setTimelockParameters",
+ ];
+
+ // check global parameters
+ checkParams(createGenesisSovereignParams, mandatoryParameters);
+
+ // check preMintedAccounts parameters
+ if (createGenesisSovereignParams.setPreMintAccounts === true) {
+ if (createGenesisSovereignParams.preMintAccounts === undefined || createGenesisSovereignParams.preMintAccounts === '') {
+ logger.error('setPreMintAccounts is set to true but missing parameter preMintAccounts');
+ process.exit(1);
+ }
+
+ // Check all preMintAccounts parameters
+ for (const preMintAccount of createGenesisSovereignParams.preMintAccounts) {
+ const paramsPreMintAccount = [
+ 'balance',
+ 'address',
+ ];
+
+ checkParams(preMintAccount, paramsPreMintAccount);
+
+ if (ethers.isAddress(preMintAccount.address) == false) {
+ logger.error(`preMintAccount.address ${preMintAccount.address}: not a valid address`);
+ process.exit(1);
+ }
+ }
+ }
+
+ // check timelock parameters
+ if (createGenesisSovereignParams.setTimelockParameters === true) {
+ if (createGenesisSovereignParams.timelockParameters === undefined || createGenesisSovereignParams.timelockParameters === '') {
+ logger.error('setTimelockParameters is set to true but missing parameter timelockParameters');
+ process.exit(1);
+ }
+
+ const paramsTimelockParameters = [
+ 'adminAddress',
+ 'minDelay',
+ ];
+
+ checkParams(createGenesisSovereignParams.timelockParameters, paramsTimelockParameters);
+ }
+
+ /////////////////////////////////////////////
+ /// CHECK SC PARAMS & ON-CHAIN DATA ///
+ /////////////////////////////////////////////
+ logger.info('Check SovereignBridge requirements for its correct initialization');
+
+ // Load Rollup manager
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
+ const rollupManagerContract = PolygonRollupManagerFactory.attach(
+ createGenesisSovereignParams.rollupManagerAddress
+ ) as PolygonRollupManager;
+
+ // Checks like in bridge contract
+ if (
+ ethers.isAddress(createGenesisSovereignParams.gasTokenAddress) &&
+ createGenesisSovereignParams.gasTokenAddress !== ethers.ZeroAddress &&
+ createGenesisSovereignParams.sovereignWETHAddress === ethers.ZeroAddress &&
+ createGenesisSovereignParams.sovereignWETHAddressIsNotMintable === true
+ ) {
+ throw new Error(
+ "InvalidSovereignWETHAddressParams: if gasTokenAddress is not 0x0, and sovereignWETHAddress is 0x0, sovereignWETHAddressIsNotMintable must be false"
+ );
+ }
+
+ if (
+ createGenesisSovereignParams.gasTokenAddress === ethers.ZeroAddress &&
+ (createGenesisSovereignParams.sovereignWETHAddress !== ethers.ZeroAddress ||
+ createGenesisSovereignParams.sovereignWETHAddressIsNotMintable === true)
+ ) {
+ throw new Error(
+ "InvalidSovereignWETHAddressParams: If gasTokenAddress is 0x0, sovereignWETHAddress must be 0x0 and sovereignWETHAddressIsNotMintable must be false"
+ );
+ }
+
+ // Create output
+ const outputJson = {} as any;
+
+ // get token information
+ let gasTokenAddress, gasTokenNetwork, gasTokenMetadata;
+
+ // Get bridge instance
+ const bridgeFactory = await ethers.getContractFactory("PolygonZkEVMBridgeV2");
+ const bridgeContractAddress = await rollupManagerContract.bridgeAddress();
+ const rollupBridgeContract = bridgeFactory.attach(bridgeContractAddress) as PolygonZkEVMBridgeV2;
+
+ // check bridge address is the same in genesisBase and on-chain
+ checkBridgeAddress(genesisBase, bridgeContractAddress);
+
+ if (
+ ethers.isAddress(createGenesisSovereignParams.gasTokenAddress) &&
+ createGenesisSovereignParams.gasTokenAddress !== ethers.ZeroAddress
+ ) {
+ logger.info('Getting data from the gasTokenAddress');
+ // Get token metadata
+ gasTokenMetadata = await rollupBridgeContract.getTokenMetadata(createGenesisSovereignParams.gasTokenAddress);
+ outputJson.gasTokenMetadata = gasTokenMetadata;
+ // If gas token metadata includes `0x124e4f545f56414c49445f454e434f44494e47 (NOT_VALID_ENCODING)` means there is no erc20 token deployed at the selected gas token network
+ if (gasTokenMetadata.includes("124e4f545f56414c49445f454e434f44494e47")) {
+ throw new Error(
+ `Invalid gas token address, no ERC20 token deployed at the selected gas token network ${createGenesisSovereignParams.gasTokenAddress}`
+ );
+ }
+ const wrappedData = await rollupBridgeContract.wrappedTokenToTokenInfo(createGenesisSovereignParams.gasTokenAddress);
+ if (wrappedData.originNetwork != 0n) {
+ // Wrapped token
+ gasTokenAddress = wrappedData.originTokenAddress;
+ gasTokenNetwork = wrappedData.originNetwork;
+ } else {
+ // Mainnet token
+ gasTokenAddress = createGenesisSovereignParams.gasTokenAddress;
+ gasTokenNetwork = 0n;
+ }
+ } else {
+ gasTokenAddress = ethers.ZeroAddress;
+ gasTokenNetwork = 0;
+ gasTokenMetadata = "0x";
+ }
+
+
+ ////////////////////////////////////
+ /// FINAL GENESIS CREATION ///
+ ////////////////////////////////////
+
+ // start final genesis creation
+ let finalGenesis = genesisBase;
+
+ // initialize sovereign bridge parameters
+ const initializeParams = {
+ rollupID: createGenesisSovereignParams.rollupID,
+ gasTokenAddress,
+ gasTokenNetwork,
+ polygonRollupManager: ethers.ZeroAddress,
+ gasTokenMetadata,
+ bridgeManager: createGenesisSovereignParams.bridgeManager,
+ sovereignWETHAddress: createGenesisSovereignParams.sovereignWETHAddress,
+ sovereignWETHAddressIsNotMintable: createGenesisSovereignParams.sovereignWETHAddressIsNotMintable,
+ globalExitRootUpdater: createGenesisSovereignParams.globalExitRootUpdater,
+ globalExitRootRemover: createGenesisSovereignParams.globalExitRootRemover,
+ };
+
+ logger.info('Update genesis-base to the SovereignContracts');
+ finalGenesis = await updateVanillaGenesis(finalGenesis, createGenesisSovereignParams.chainID, initializeParams);
+
+ // Add weth address to deployment output if gas token address is provided and sovereignWETHAddress is not provided
+ let outWETHAddress;
+ if (
+ gasTokenAddress !== ethers.ZeroAddress &&
+ ethers.isAddress(gasTokenAddress) &&
+ (createGenesisSovereignParams.sovereignWETHAddress === ethers.ZeroAddress ||
+ !ethers.isAddress(createGenesisSovereignParams.sovereignWETHAddress))
+ ) {
+ console.log("Rollup with custom gas token, adding WETH address to deployment output...");
+ const wethObject = genesisBase.genesis.find(function (obj: {contractName: string}) {
+ return obj.contractName == "WETH";
+ });
+ outWETHAddress = wethObject.address;
+ }
+
+ // set preMintAccounts
+ let totalPreMintedAmount = BigInt(0);
+ if (createGenesisSovereignParams.setPreMintAccounts === true) {
+ logger.info('Add preMintAccounts');
+
+ // iterate over all premintAccounts
+ for (let i = 0; i < createGenesisSovereignParams.preMintAccounts.length; i++) {
+ const preMintAccount = createGenesisSovereignParams.preMintAccounts[i];
+
+ // check if preMintAccount is in the current genesis
+ const preMintAccountExist = finalGenesis.genesis.find(function (obj) {
+ return obj.address.toLowerCase() === preMintAccount.address.toLowerCase();
+ });
+
+ if (typeof preMintAccountExist !== 'undefined') {
+ // check if preMintAccount has code
+ if (preMintAccountExist.bytecode !== undefined) {
+ logger.error(`preMintAccount ${preMintAccount.address} code is not empty`);
+ process.exit(1);
+ }
+ preMintAccountExist.balance = BigInt(preMintAccount.balance).toString();
+ } else {
+ // add preMintAccount.address & preMintAccount.balance
+ finalGenesis.genesis.push({
+ accountName: `preMintAccount_${i}`,
+ balance: BigInt(preMintAccount.balance).toString(),
+ address: preMintAccount.address,
+ });
+ }
+
+ totalPreMintedAmount += BigInt(preMintAccount.balance);
+ }
+ }
+
+ // set timelock storage
+ if (createGenesisSovereignParams.setTimelockParameters === true) {
+ logger.info('Add timelockParameters');
+ const timelockContractInfo = finalGenesis.genesis.find(function (obj) {
+ return obj.contractName === 'PolygonZkEVMTimelock';
+ });
+
+ const storageTimelock = initializeTimelockStorage(
+ createGenesisSovereignParams.timelockParameters.minDelay,
+ createGenesisSovereignParams.timelockParameters.adminAddress,
+ timelockContractInfo.address,
+ );
+
+ timelockContractInfo.storage = storageTimelock;
+ }
+
+ // regenerate root with the zkEVM root
+ const poseidon = await getPoseidon();
+ const {F} = poseidon;
+
+ const zkEVMDB = await ZkEVMDB.newZkEVM(
+ new MemDB(F),
+ poseidon,
+ [F.zero, F.zero, F.zero, F.zero],
+ [F.zero, F.zero, F.zero, F.zero],
+ finalGenesis.genesis,
+ null,
+ null,
+ createGenesisSovereignParams.chainID
+ );
+
+ // update genesis root
+ finalGenesis.root = smtUtils.h4toString(zkEVMDB.getCurrentStateRoot());
+
+ // extract all [names <--> address] from genesis
+ const genesisSCNames = finalGenesis.genesis.reduce((acc: any, obj: any) => {
+ if (obj.bytecode !== undefined) {
+ acc[obj.contractName] = obj.address;
+ }
+ return acc;
+ }, {});
+
+ // format genesis
+ if (createGenesisSovereignParams.formatGenesis !== undefined) {
+ logger.info(`Formatting genesis output to: ${createGenesisSovereignParams.formatGenesis}`);
+ finalGenesis = formatGenesis(finalGenesis, createGenesisSovereignParams.formatGenesis);
+ }
+
+ // get L1 information
+ logger.info(`Getting L1 information`);
+ const RollupManagerInfo = {} as any;
+
+ const rollupData = await rollupManagerContract.rollupIDToRollupData(createGenesisSovereignParams.rollupID);
+
+ RollupManagerInfo.bridgeAddress = await rollupManagerContract.bridgeAddress();
+ RollupManagerInfo.globalExitRootManager = await rollupManagerContract.globalExitRootManager();
+ RollupManagerInfo.pol = await rollupManagerContract.pol();
+ RollupManagerInfo.rollupData = {
+ rollupID: createGenesisSovereignParams.rollupID,
+ rollupAddress: rollupData[0],
+ }
+
+ // Populate final output
+ const gitInfo = getGitInfo();
+ outputJson.gitInfo = gitInfo;
+ outputJson.network = hardhatArguments.network;
+ outputJson.rollupManagerAddress = createGenesisSovereignParams.rollupManagerAddress;
+ outputJson.RollupManagerInfo = RollupManagerInfo;
+ outputJson.gasTokenAddress = gasTokenAddress;
+ outputJson.gasTokenNetwork = gasTokenNetwork;
+ outputJson.gasTokenMetadata = gasTokenMetadata;
+ outputJson.chainID = createGenesisSovereignParams.chainID;
+ outputJson.bridgeManager = createGenesisSovereignParams.bridgeManager;
+ outputJson.sovereignWETHAddress = createGenesisSovereignParams.sovereignWETHAddress;
+ outputJson.sovereignWETHAddressIsNotMintable = createGenesisSovereignParams.sovereignWETHAddressIsNotMintable;
+ outputJson.globalExitRootUpdater = createGenesisSovereignParams.globalExitRootUpdater;
+ outputJson.globalExitRootRemover = createGenesisSovereignParams.globalExitRootRemover;
+ outputJson.genesisSCNames = genesisSCNames;
+
+ if (createGenesisSovereignParams.setPreMintAccounts === true) {
+ outputJson.preMintAccounts = createGenesisSovereignParams.preMintAccounts;
+ outputJson.totalPreMintedAmount = totalPreMintedAmount.toString();
+ }
+
+ if (createGenesisSovereignParams.setTimelockParameters === true) {
+ outputJson.timelockParameters = createGenesisSovereignParams.timelockParameters;
+ }
+
+ if (typeof outWETHAddress !== 'undefined') {
+ outputJson.WETHAddress = outWETHAddress;
+ }
+
+ if (createGenesisSovereignParams.formatGenesis !== undefined) {
+ outputJson.formatGenesis = createGenesisSovereignParams.formatGenesis;
+ }
+
+
+ ///////////////////////////////////
+ /// WRITE FINAL FILES ///
+ ///////////////////////////////////
+ logger.info('Writing final output files');
+
+ // path output genesis
+ const pathOutputGenesisJson = createGenesisSovereignParams.outputGenesisPath
+ ? path.join(__dirname, createGenesisSovereignParams.outputGenesisPath)
+ : path.join(__dirname, `./genesis-rollupID-${createGenesisSovereignParams.rollupID}__${dateStr}.json`);
+
+ const pathOutputJson = createGenesisSovereignParams.outputPath
+ ? path.join(__dirname, createGenesisSovereignParams.outputPath)
+ : path.join(__dirname, `./output-rollupID-${createGenesisSovereignParams.rollupID}__${dateStr}.json`);
+
+ // write files
+ fs.writeFileSync(pathOutputGenesisJson, JSON.stringify(finalGenesis, null, 1));
+ fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1));
+
+ logger.info("Output saved at:");
+ logger.info(` output genesis: ${pathOutputGenesisJson}`);
+ logger.info(` output info : ${pathOutputJson}`);
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
diff --git a/tools/createSovereignGenesis/genesis-base.json.example b/tools/createSovereignGenesis/genesis-base.json.example
new file mode 100644
index 000000000..1004ccbc7
--- /dev/null
+++ b/tools/createSovereignGenesis/genesis-base.json.example
@@ -0,0 +1,92 @@
+{
+ "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridge implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridge proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00",
+ "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "0",
+ "nonce": "8",
+ "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tools/createSovereignGenesis/helpers.ts b/tools/createSovereignGenesis/helpers.ts
new file mode 100644
index 000000000..a4d5ba2cc
--- /dev/null
+++ b/tools/createSovereignGenesis/helpers.ts
@@ -0,0 +1,68 @@
+import { execSync } from "child_process";
+
+/**
+ * Format genesis file to a specific format
+ * @param genesis original legacy genesis file
+ * @param format Format type
+ * @returns new genesis format
+ */
+function formatGenesis(genesis: { genesis: any[]; }, format: any){
+ switch (format) {
+ case "geth":
+ return _formatGeth(genesis);
+ default:
+ throw new Error(`formatGenesis: unknown format: ${format}`);
+ }
+}
+
+/**
+ * Format legacy genesis file to geth format
+ * @param genesis legacy genesis file
+ * @returns Geth genesis format
+ */
+function _formatGeth(genesis: { genesis: any[]; }) {
+ return genesis.genesis.reduce((acc, contract) => {
+ acc[contract.address] = {};
+
+ if (contract.bytecode !== undefined) {
+ acc[contract.address].code = contract.bytecode;
+ }
+
+ if (contract.storage !== undefined) {
+ acc[contract.address].storage = contract.storage;
+ }
+
+ if (contract.balance !== undefined) {
+ acc[contract.address].balance = `0x${BigInt(contract.balance).toString(16)}`;
+ }
+
+ if (contract.nonce !== undefined) {
+ acc[contract.address].nonce = `0x${BigInt(contract.nonce).toString(16)}`;
+ }
+
+ return acc;
+ }, {});
+}
+
+/**
+ * Retrieves the current Git commit hash and repository URL
+ * @returns An object containing the commit hash and repository URL, or null if an error occurs
+ */
+function getGitInfo(): { commit: string; repo: string } | null {
+ try {
+ // Get the latest commit hash
+ const commit = execSync("git rev-parse HEAD").toString().trim();
+
+ // Get the repository URL
+ const repo = execSync("git config --get remote.origin.url").toString().trim();
+
+ return { commit, repo };
+ } catch (error) {
+ throw new Error(`getGitInfo: ${error}`);
+ }
+}
+
+module.exports = {
+ formatGenesis,
+ getGitInfo,
+};
\ No newline at end of file
diff --git a/tools/createSovereignGenesisWithHardhat/.gitignore b/tools/createSovereignGenesisWithHardhat/.gitignore
new file mode 100644
index 000000000..90d5f2d60
--- /dev/null
+++ b/tools/createSovereignGenesisWithHardhat/.gitignore
@@ -0,0 +1 @@
+genesis-sovereign_hardhat.json
\ No newline at end of file
diff --git a/tools/createSovereignGenesisWithHardhat/createSovereignGenesisWithHardhat.ts b/tools/createSovereignGenesisWithHardhat/createSovereignGenesisWithHardhat.ts
new file mode 100644
index 000000000..ec8ca6eca
--- /dev/null
+++ b/tools/createSovereignGenesisWithHardhat/createSovereignGenesisWithHardhat.ts
@@ -0,0 +1,506 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if, import/no-dynamic-require */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved, no-restricted-syntax */
+import {expect} from "chai";
+import path = require("path");
+import fs = require("fs");
+
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../.env")});
+import yargs from "yargs/yargs";
+import {getStorageAt, setCode, setNonce, setStorageAt} from "@nomicfoundation/hardhat-network-helpers";
+
+const argv = yargs(process.argv.slice(2))
+ .options({
+ test: {type: "boolean", default: false},
+ input: {type: "string", default: "../../deployment/v2/deploy_parameters.json"},
+ out: {type: "string", default: "./genesis-sovereign_hardhat.json"},
+ })
+ .parse() as any;
+
+const DEFAULT_MNEMONIC = "test test test test test test test test test test test junk";
+process.env.HARDHAT_NETWORK = "hardhat";
+process.env.MNEMONIC = argv.test ? DEFAULT_MNEMONIC : process.env.MNEMONIC;
+import {ethers, upgrades} from "hardhat";
+import {MemDB, ZkEVMDB, getPoseidon, smtUtils} from "@0xpolygonhermez/zkevm-commonjs";
+
+import {deployPolygonZkEVMDeployer, create2Deployment} from "../../deployment/helpers/deployment-helpers";
+import {ProxyAdmin, BridgeL2SovereignChain} from "../../typechain-types";
+import {Addressable} from "ethers";
+
+import "../../deployment/helpers/utils";
+
+const deployParameters = require(argv.input);
+const pathOutputJson = path.join(__dirname, argv.out);
+const genesisSovereign = require("../../docker/deploymentOutput/genesis_sovereign.json");
+const createRollupParameters = require("../../deployment/v2/create_rollup_parameters.json");
+const createRollupOutput = require("../../docker/deploymentOutput/create_rollup_output.json");
+/*
+ * bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
+ * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+ */
+const _ADMIN_SLOT = "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" as any;
+const _IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc" as any;
+
+const zkevmAddressL2 = ethers.ZeroAddress;
+const globalExitRootL2ProxyAddress = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa";
+
+async function main() {
+ // Constant variables
+ const balanceBridge = BigInt("0xffffffffffffffffffffffffffffffff"); // 128 bits
+ const genesis = [];
+
+ // load deploy parameters
+ const mandatoryDeploymentParameters = [
+ "timelockAdminAddress",
+ "minDelayTimelock",
+ "salt",
+ "initialZkEVMDeployerOwner",
+ ];
+
+ for (const parameterName of mandatoryDeploymentParameters) {
+ if (deployParameters[parameterName] === undefined || deployParameters[parameterName] === "") {
+ throw new Error(`Missing parameter: ${parameterName}`);
+ }
+ }
+ let {timelockAdminAddress, minDelayTimelock, salt, initialZkEVMDeployerOwner} = deployParameters;
+
+ // Load deployer
+ await ethers.provider.send("hardhat_impersonateAccount", [initialZkEVMDeployerOwner]);
+ await ethers.provider.send("hardhat_setBalance", [initialZkEVMDeployerOwner, "0xffffffffffffffff"]); // 18 ethers aprox
+ const deployer = await ethers.getSigner(initialZkEVMDeployerOwner);
+
+ // Deploy PolygonZkEVMDeployer if is not deployed already
+ const [zkEVMDeployerContract, keylessDeployer] = await deployPolygonZkEVMDeployer(
+ initialZkEVMDeployerOwner,
+ deployer
+ );
+ const finalDeployer = deployer.address;
+ const finalKeylessDeployer = keylessDeployer;
+ const finalZkEVMDeployerAddress = zkEVMDeployerContract.target;
+ /*
+ * Deploy Bridge
+ * Deploy admin --> implementation --> proxy
+ */
+
+ // Deploy proxy admin:
+ const proxyAdminFactory = await ethers.getContractFactory(
+ "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol:ProxyAdmin",
+ deployer
+ );
+ const deployTransactionAdmin = (await proxyAdminFactory.getDeployTransaction()).data;
+ const dataCallAdmin = proxyAdminFactory.interface.encodeFunctionData("transferOwnership", [deployer.address]);
+ const [proxyAdminAddress] = await create2Deployment(
+ zkEVMDeployerContract,
+ salt,
+ deployTransactionAdmin,
+ dataCallAdmin,
+ deployer,
+ null
+ );
+
+ // Deploy implementation SovereignBridge
+ const bridgeContractName = "BridgeL2SovereignChain";
+ const sovereignBridgeFactory = await ethers.getContractFactory(bridgeContractName, deployer);
+ const deployTransactionBridge = (await sovereignBridgeFactory.getDeployTransaction()).data;
+ // Mandatory to override the gasLimit since the estimation with create are mess up D:
+ const overrideGasLimit = BigInt(5500000);
+ let [bridgeImplementationAddress] = await create2Deployment(
+ zkEVMDeployerContract,
+ salt,
+ deployTransactionBridge,
+ null,
+ deployer,
+ overrideGasLimit
+ );
+ // Get genesis params
+ const sovereignGenesisBridgeProxy = genesisSovereign.genesis.find(function (obj) {
+ return obj.contractName == "BridgeL2SovereignChain proxy";
+ });
+ const sovereignGenesisBridgeImplementation = genesisSovereign.genesis.find(function (obj) {
+ return obj.contractName == "BridgeL2SovereignChain";
+ });
+ const sovereignGenesisGERProxy = genesisSovereign.genesis.find(function (obj) {
+ return obj.contractName == "GlobalExitRootManagerL2SovereignChain proxy";
+ });
+ const sovereignGenesisGERImplementation = genesisSovereign.genesis.find(function (obj) {
+ return obj.contractName == "GlobalExitRootManagerL2SovereignChain";
+ });
+ const sovereignDeployerAccount = genesisSovereign.genesis.find(function (obj) {
+ return obj.accountName == "deployer";
+ });
+ // Change bridge implementation address to the one set at original sovereign genesis. The address is different because they have different initcode
+ const deployedBytecode = await ethers.provider.getCode(bridgeImplementationAddress as string);
+ bridgeImplementationAddress = sovereignGenesisBridgeImplementation.address;
+ await setCode(bridgeImplementationAddress as string, deployedBytecode);
+ await setNonce(bridgeImplementationAddress as string, 1);
+ /*
+ * deploy bridge proxy and initialize
+ */
+ const transparentProxyFactory = await ethers.getContractFactory(
+ "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy",
+ deployer
+ );
+ const initializeEmptyDataProxy = "0x";
+ const deployTransactionProxy = (
+ await transparentProxyFactory.getDeployTransaction(
+ bridgeImplementationAddress as string, // must have bytecode
+ proxyAdminAddress as string,
+ initializeEmptyDataProxy
+ )
+ ).data;
+
+ let [proxyBridgeAddress] = await create2Deployment(
+ zkEVMDeployerContract,
+ salt,
+ deployTransactionProxy,
+ null,
+ deployer,
+ null
+ );
+ // Import OZ manifest the deployed contracts, its enough to import just the proxy, the rest are imported automatically ( admin/impl)
+ await upgrades.forceImport(proxyBridgeAddress as string, sovereignBridgeFactory, "transparent" as any);
+ /*
+ *Deployment Global exit root manager implementation, proxy and initialize
+ */
+ const {sovereignParams} = createRollupParameters;
+ const globalExitRootContractName = "GlobalExitRootManagerL2SovereignChain";
+ const GERSovereignFactory = await ethers.getContractFactory(globalExitRootContractName, deployer);
+ const proxyGERContract = await upgrades.deployProxy(GERSovereignFactory, [sovereignParams.globalExitRootUpdater], {
+ constructorArgs: [proxyBridgeAddress as string],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+ const proxyGERAddress = proxyGERContract.target;
+ let GERImplementationAddress = await upgrades.erc1967.getImplementationAddress(proxyGERAddress as string);
+
+ expect(sovereignGenesisGERImplementation.bytecode).to.be.equal(
+ await ethers.provider.getCode(GERImplementationAddress)
+ );
+ // Compare storage
+ for (const key in sovereignGenesisGERProxy.storage) {
+ expect(sovereignGenesisGERProxy.storage[key]).to.be.equal(await getStorageAt(proxyGERAddress as string, key));
+ }
+ // Assert admin address
+ expect(await upgrades.erc1967.getAdminAddress(proxyGERAddress as string)).to.be.equal(proxyAdminAddress);
+ expect(await upgrades.erc1967.getAdminAddress(proxyBridgeAddress as string)).to.be.equal(proxyAdminAddress);
+
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+ const timelockContract = await timelockContractFactory.deploy(
+ minDelayTimelock,
+ [timelockAdminAddress],
+ [timelockAdminAddress],
+ timelockAdminAddress,
+ zkevmAddressL2
+ );
+ await timelockContract.waitForDeployment();
+ const finalTimelockContractAddress = timelockContract.target;
+
+ // Transfer ownership of the proxyAdmin to timelock
+ const proxyAdminInstance = proxyAdminFactory.attach(proxyAdminAddress as string) as ProxyAdmin;
+ await (await proxyAdminInstance.connect(deployer).transferOwnership(finalTimelockContractAddress as string)).wait();
+
+ // Initialize bridge
+ const sovereignBridgeContract = sovereignBridgeFactory.attach(
+ bridgeImplementationAddress as string
+ ) as BridgeL2SovereignChain;
+ let gasTokenMetadata, gasTokenAddress, gasTokenNetwork;
+ if (
+ createRollupParameters.gasTokenAddress &&
+ createRollupParameters.gasTokenAddress !== "" &&
+ createRollupParameters.gasTokenAddress !== ethers.ZeroAddress
+ ) {
+ gasTokenMetadata = createRollupOutput.gasTokenMetadata
+ gasTokenAddress = createRollupParameters.gasTokenAddress;
+ const wrappedData = await sovereignBridgeContract.wrappedTokenToTokenInfo(
+ createRollupParameters.gasTokenAddress
+ );
+ if (wrappedData.originNetwork != 0n) {
+ // Wrapped token
+ gasTokenAddress = wrappedData.originTokenAddress;
+ gasTokenNetwork = wrappedData.originNetwork;
+ } else {
+ // Mainnet token
+ gasTokenAddress = createRollupParameters.gasTokenAddress;
+ gasTokenNetwork = 0;
+ }
+ } else {
+ gasTokenMetadata = "0x";
+ gasTokenAddress = ethers.ZeroAddress;
+ gasTokenNetwork = 0;
+ }
+ const initializeData = sovereignBridgeFactory.interface.encodeFunctionData(
+ "initialize(uint32,address,uint32,address,address,bytes,address,address,bool)",
+ [
+ 1, //rollupID
+ gasTokenAddress,
+ gasTokenNetwork, //gasTokenNetwork,
+ sovereignGenesisGERProxy.address, // GlobalExitRootManager address
+ ethers.ZeroAddress, //polygonRollupManager
+ gasTokenMetadata, //gasTokenMetadata,
+ sovereignParams.bridgeManager,
+ sovereignParams.sovereignWETHAddress,
+ sovereignParams.sovereignWETHAddressIsNotMintable,
+ ]
+ );
+ await deployer.sendTransaction({
+ to: proxyBridgeAddress as string,
+ data: initializeData,
+ });
+ // Check bytecode
+ expect(sovereignGenesisBridgeProxy.bytecode).to.be.equal(
+ await ethers.provider.getCode(proxyBridgeAddress as string)
+ );
+ // Check storage
+ for (const key in sovereignGenesisBridgeProxy.storage) {
+ const as = await getStorageAt(proxyBridgeAddress as string, key)
+ expect(sovereignGenesisBridgeProxy.storage[key]).to.be.equal(
+ await getStorageAt(proxyBridgeAddress as string, key)
+ );
+ }
+
+ // Check weth
+ if (
+ createRollupParameters.gasTokenAddress &&
+ createRollupParameters.gasTokenAddress !== "" &&
+ createRollupParameters.gasTokenAddress !== ethers.ZeroAddress
+ ) {
+ const sovereignBridgeProxyContract = sovereignBridgeFactory.attach(
+ proxyBridgeAddress as string
+ ) as BridgeL2SovereignChain;
+ // Add deployed weth
+ const wethAddress = await sovereignBridgeProxyContract.WETHToken()
+ const wethBytecode = await ethers.provider.getCode(wethAddress)
+ const sovereignWETH = genesisSovereign.genesis.find(function (obj) {
+ return obj.contractName == "WETH";
+ });
+ // Check storage
+ for (const key in sovereignWETH.storage) {
+ expect(sovereignWETH.storage[key]).to.be.equal(await getStorageAt(wethAddress, key));
+ }
+ genesis.push({
+ contractName: "WETH",
+ balance: "0",
+ nonce: "1",
+ address: wethAddress,
+ bytecode: wethBytecode,
+ storage: sovereignWETH.storage,
+ });
+ }
+
+ // ZKEVMDeployer
+ const zkEVMDeployerInfo = await getAddressInfo(zkEVMDeployerContract.target);
+ genesis.push({
+ contractName: "PolygonZkEVMDeployer",
+ balance: "0",
+ nonce: zkEVMDeployerInfo.nonce.toString(),
+ address: finalZkEVMDeployerAddress,
+ bytecode: zkEVMDeployerInfo.bytecode,
+ storage: zkEVMDeployerInfo.storage,
+ });
+
+ // Proxy Admin
+ const proxyAdminInfo = await getAddressInfo(proxyAdminAddress as string);
+ genesis.push({
+ contractName: "ProxyAdmin",
+ balance: "0",
+ nonce: proxyAdminInfo.nonce.toString(),
+ address: proxyAdminAddress,
+ bytecode: proxyAdminInfo.bytecode,
+ storage: proxyAdminInfo.storage,
+ });
+
+ // Bridge implementation
+ const bridgeImplementationInfo = await getAddressInfo(bridgeImplementationAddress as string);
+ genesis.push({
+ contractName: `${bridgeContractName}`,
+ balance: "0",
+ nonce: bridgeImplementationInfo.nonce.toString(),
+ address: bridgeImplementationAddress,
+ bytecode: bridgeImplementationInfo.bytecode,
+ // storage: bridgeImplementationInfo.storage, implementation do not have storage
+ });
+
+ // Bridge proxy
+ const bridgeProxyInfo = await getAddressInfo(proxyBridgeAddress as string);
+ // Override admin and implementation slots:
+ bridgeProxyInfo.storage[_ADMIN_SLOT] = ethers.zeroPadValue(proxyAdminAddress as string, 32);
+ bridgeProxyInfo.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(bridgeImplementationAddress as string, 32);
+
+ genesis.push({
+ contractName: `${bridgeContractName} proxy`,
+ balance: balanceBridge,
+ nonce: bridgeProxyInfo.nonce.toString(),
+ address: proxyBridgeAddress,
+ bytecode: bridgeProxyInfo.bytecode,
+ storage: sovereignGenesisBridgeProxy.storage, // Already checked is the same
+ });
+
+ // GER Manager implementation
+ const implGlobalExitRootL2Info = await getAddressInfo(GERImplementationAddress as string);
+
+ genesis.push({
+ contractName: `${globalExitRootContractName}`,
+ balance: "0",
+ nonce: implGlobalExitRootL2Info.nonce.toString(),
+ address: GERImplementationAddress,
+ bytecode: implGlobalExitRootL2Info.bytecode,
+ });
+
+ // polygonZkEVMGlobalExitRootL2 proxy
+ const proxyGlobalExitRootL2Info = await getAddressInfo(proxyGERAddress as string);
+
+ proxyGlobalExitRootL2Info.storage[_ADMIN_SLOT] = ethers.zeroPadValue(proxyAdminAddress as string, 32);
+ proxyGlobalExitRootL2Info.storage[_IMPLEMENTATION_SLOT] = ethers.zeroPadValue(
+ GERImplementationAddress as string,
+ 32
+ );
+
+ genesis.push({
+ contractName: `${globalExitRootContractName} proxy`,
+ balance: "0",
+ nonce: proxyGlobalExitRootL2Info.nonce.toString(),
+ address: globalExitRootL2ProxyAddress,
+ bytecode: proxyGlobalExitRootL2Info.bytecode,
+ storage: proxyGlobalExitRootL2Info.storage,
+ });
+
+ // Timelock
+ const timelockInfo = await getAddressInfo(timelockContract.target);
+
+ /*
+ * Since roles are used, most storage is written in pseudoRandom storage slots
+ * bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE");
+ * bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
+ * bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
+ * bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE");
+ */
+ const timelockRolesHash = [
+ ethers.id("TIMELOCK_ADMIN_ROLE"),
+ ethers.id("PROPOSER_ROLE"),
+ ethers.id("EXECUTOR_ROLE"),
+ ethers.id("CANCELLER_ROLE"),
+ ];
+
+ for (let i = 0; i < timelockRolesHash.length; i++) {
+ const rolesMappingStoragePositionStruct = 0;
+ const storagePosition = ethers.solidityPackedKeccak256(
+ ["uint256", "uint256"],
+ [timelockRolesHash[i], rolesMappingStoragePositionStruct]
+ );
+
+ // check timelock address manager, and timelock address itself
+ const addressArray = [timelockAdminAddress, timelockContract.target];
+ for (let j = 0; j < addressArray.length; j++) {
+ const storagePositionRole = ethers.solidityPackedKeccak256(
+ ["uint256", "uint256"],
+ [addressArray[j], storagePosition]
+ );
+ const valueRole = await ethers.provider.getStorage(timelockContract.target, storagePositionRole);
+ if (valueRole !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ timelockInfo.storage[storagePositionRole] = valueRole;
+ }
+ }
+ const roleAdminSlot = ethers.zeroPadValue(ethers.toQuantity(ethers.toBigInt(storagePosition) + 1n), 32);
+ const valueRoleAdminSlot = await ethers.provider.getStorage(timelockContract.target, roleAdminSlot);
+ if (valueRoleAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ timelockInfo.storage[roleAdminSlot] = valueRoleAdminSlot;
+ }
+ }
+
+ genesis.push({
+ contractName: "PolygonZkEVMTimelock",
+ balance: "0",
+ nonce: timelockInfo.nonce.toString(),
+ address: finalTimelockContractAddress,
+ bytecode: timelockInfo.bytecode,
+ storage: timelockInfo.storage,
+ });
+
+ // Put nonces on deployers
+
+ // Keyless deployer
+ genesis.push({
+ accountName: "keyless Deployer",
+ balance: "0",
+ nonce: "1",
+ address: finalKeylessDeployer,
+ });
+
+ // deployer
+ const deployerInfo = await getAddressInfo(deployer.address);
+ genesis.push({
+ accountName: "deployer",
+ balance: "0",
+ nonce: sovereignDeployerAccount.nonce, // We get nonce from sovereign genesis because the number of transactions is different. With hardhat proxies are deployed and initialized in same transaction
+ address: finalDeployer,
+ });
+
+ if (deployParameters.test) {
+ // Add tester account with ether
+ genesis[genesis.length - 1].balance = "100000000000000000000000";
+ }
+
+ // calculate root
+ const poseidon = await getPoseidon();
+ const {F} = poseidon;
+ const db = new MemDB(F);
+ const genesisRoot = [F.zero, F.zero, F.zero, F.zero];
+ const accHashInput = [F.zero, F.zero, F.zero, F.zero];
+ const defaultChainId = 1000;
+
+ const zkEVMDB = await ZkEVMDB.newZkEVM(
+ db,
+ poseidon,
+ genesisRoot,
+ accHashInput,
+ genesis,
+ null,
+ null,
+ defaultChainId
+ );
+ // Check roots match
+ const SR = smtUtils.h4toString(zkEVMDB.stateRoot)
+ //expect(SR).to.be.equal(genesisSovereign.root);
+ fs.writeFileSync(
+ pathOutputJson,
+ JSON.stringify(
+ {
+ root: SR,
+ genesis: genesis,
+ },
+ null,
+ 1
+ )
+ );
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
+
+async function getAddressInfo(address: string | Addressable) {
+ const nonce = await ethers.provider.getTransactionCount(address);
+ const bytecode = await ethers.provider.getCode(address);
+
+ const storage = {} as {
+ [key: string]: number | string;
+ };
+
+ for (let i = 0; i < 200; i++) {
+ const storageValue = await ethers.provider.getStorage(address, i);
+ if (storageValue !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ storage[ethers.toBeHex(i, 32)] = storageValue;
+ }
+ }
+
+ const valueAdminSlot = await ethers.provider.getStorage(address, _ADMIN_SLOT);
+ if (valueAdminSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ storage[_ADMIN_SLOT] = valueAdminSlot;
+ }
+ const valueImplementationSlot = await ethers.provider.getStorage(address, _IMPLEMENTATION_SLOT);
+ if (valueImplementationSlot !== "0x0000000000000000000000000000000000000000000000000000000000000000") {
+ storage[_IMPLEMENTATION_SLOT] = valueImplementationSlot;
+ }
+
+ return {nonce, bytecode, storage};
+}
diff --git a/tools/deployClaimCompressor/.gitignore b/tools/deployClaimCompressor/.gitignore
new file mode 100644
index 000000000..a87ce8439
--- /dev/null
+++ b/tools/deployClaimCompressor/.gitignore
@@ -0,0 +1,2 @@
+deploy_claimCompressor.json
+deploy_claim_compressor_output.json
diff --git a/tools/deployClaimCompressor/README.md b/tools/deployClaimCompressor/README.md
new file mode 100644
index 000000000..f65c3b2f8
--- /dev/null
+++ b/tools/deployClaimCompressor/README.md
@@ -0,0 +1,57 @@
+# Deploy ClaimCompressor
+Script to deploy `ClaimCompressor.sol`
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `deploy_claimCompressor.json`:
+ - `bridgeAddress`: polygonZkEVMBridgeAddress
+ - `networkId`
+ - `deployerPvtKey`: private key deployer
+ - First option will load `deployerPvtKey`. Otherwise, `process.env.MNEMONIC` will be loaded from the `.env` file
+ - `maxFeePerGas`: set custom gas
+ - `maxPriorityFeePerGas`: set custom gas
+ - `multiplierGas`: set custom gas
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+## Usage
+
+- Copy configuration file:
+```
+cp ./tools/deployClaimCompressor/deploy_claimCompressor.json.example ./tools/deployClaimCompressor/deploy_claimCompressor.json
+```
+
+- Set your parameters
+- Run tool:
+```
+npx hardhat run ./tools/deployClaimCompressor/deployClaimCompressor.ts --network
+```
+
+- Output:
+ - `deploy_claim_compressor_output.json`:
+ ```
+ {
+ "deployer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "ClaimCompressorContract": "0x851356ae760d987E095750cCeb3bC6014560891C"
+ }
+ ```
+ - logs:
+ ```
+ deploying with: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ #######################
+
+ Claim Compressor deployed to: 0xc5a5C42992dECbae36851359345FE25997F5C42d
+ #######################
+
+ you can verify the contract address with:
+ npx hardhat verify --constructor-args upgrade/arguments.js 0xc5a5C42992dECbae36851359345FE25997F5C42d --network localhost
+
+ Copy the following constructor arguments on: upgrade/arguments.js
+ [ '0x124fBB77374f2D2F0d716973C23Ab06AE49ACde5', 0 ]
+
+ ```
\ No newline at end of file
diff --git a/tools/deployClaimCompressor/deployClaimCompressor.ts b/tools/deployClaimCompressor/deployClaimCompressor.ts
index d182df6f4..2e643109a 100644
--- a/tools/deployClaimCompressor/deployClaimCompressor.ts
+++ b/tools/deployClaimCompressor/deployClaimCompressor.ts
@@ -8,6 +8,7 @@ import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../../.env")});
import {ethers, network, upgrades} from "hardhat";
const deployParameters = require("./deploy_claimCompressor.json");
+const pathOutput = path.resolve(__dirname, "./deploy_claim_compressor_output.json")
async function main() {
// Load provider
@@ -68,6 +69,11 @@ async function main() {
const ClaimCompressorContract = await ClaimCompressor.deploy(bridgeAddress, networkId);
await ClaimCompressorContract.waitForDeployment();
+ const outputJson = {
+ deployer: deployer.address,
+ ClaimCompressorContract: ClaimCompressorContract.target
+ };
+
console.log("#######################\n");
console.log("Claim Compressor deployed to:", ClaimCompressorContract.target);
console.log("#######################\n");
@@ -77,6 +83,8 @@ async function main() {
`npx hardhat verify --constructor-args upgrade/arguments.js ${ClaimCompressorContract.target} --network ${process.env.HARDHAT_NETWORK}\n`
);
console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [bridgeAddress, networkId]);
+
+ await fs.writeFileSync(pathOutput, JSON.stringify(outputJson, null, 1));
}
main().catch((e) => {
diff --git a/tools/deployPolygonDataCommittee/.gitignore b/tools/deployPolygonDataCommittee/.gitignore
new file mode 100644
index 000000000..cb5432160
--- /dev/null
+++ b/tools/deployPolygonDataCommittee/.gitignore
@@ -0,0 +1,2 @@
+deploy_dataCommittee_output.json
+deploy_dataCommittee_parameters.json
\ No newline at end of file
diff --git a/tools/deployPolygonDataCommittee/README.md b/tools/deployPolygonDataCommittee/README.md
new file mode 100644
index 000000000..84c9c7806
--- /dev/null
+++ b/tools/deployPolygonDataCommittee/README.md
@@ -0,0 +1,56 @@
+# Deploy PolygonDataCommittee
+Script to deploy `PolygonDataCommittee.sol`
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `deploy_dataCommittee_parameters.json`:
+ - `admin`
+ - `networkId`
+ - `deployerPvtKey`: private key deployer
+ - First option will load `deployerPvtKey`. Otherwise, `process.env.MNEMONIC` will be loaded from the `.env` file
+ - `maxFeePerGas`: set custom gas
+ - `maxPriorityFeePerGas`: set custom gas
+ - `multiplierGas`: set custom gas
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+
+## Usage
+> All commands are done from root repository.
+
+- Copy configuration file:
+```
+cp ./tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json.example ./tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json
+```
+
+- Run tool:
+```
+npx hardhat run ./tools/deployPolygonDataCommittee/deployPolygonDataCommittee.ts --network
+```
+
+- Output:
+ - `deploy_dataCommittee_output.json`:
+ ```
+ {
+ "polygonDataCommitteeAddress": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690",
+ "proxyAdmin": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E"
+ }
+ ```
+ - logs:
+ ```
+ deploying with: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+
+ #######################
+
+ PolygonDataCommittee deployed to: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690
+ #######################
+
+ polygonDataCommittee deployed to: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690
+ you can verify the new polygonDataCommittee address with:
+ npx hardhat verify 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 --network localhost
+ ```
diff --git a/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.example b/tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json.example
similarity index 100%
rename from tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.example
rename to tools/deployPolygonDataCommittee/deploy_dataCommittee_parameters.json.example
diff --git a/tools/deployVerifier/.gitignore b/tools/deployVerifier/.gitignore
index f5c01b984..f7240c80c 100644
--- a/tools/deployVerifier/.gitignore
+++ b/tools/deployVerifier/.gitignore
@@ -1 +1,2 @@
+deploy_verifier_output.json
deploy_verifier_parameters.json
\ No newline at end of file
diff --git a/tools/deployVerifier/README.md b/tools/deployVerifier/README.md
index 1d2864d90..142da8e86 100644
--- a/tools/deployVerifier/README.md
+++ b/tools/deployVerifier/README.md
@@ -7,7 +7,7 @@ npm i
```
## Setup
-- Config file
+- Config file `deploy_verifier_parameters.json`:
- `realVerifier`: select between a real or a mock verifer
- `forkID`: Select fork to verifier to be deployed (if a real verfifier is selected)
- `deployerPvtKey`: private key deployer
@@ -26,11 +26,33 @@ npm i
- Copy configuration file:
```
-cp ./tools/deployVerifier/deploy_verifier_parameters.example ./tools/deployVerifier/deploy_verifier_parameters.json
+cp ./tools/deployVerifier/deploy_verifier_parameters.json.example ./tools/deployVerifier/deploy_verifier_parameters.json
```
-
- Set your parameters
- Run tool:
```
-npx hardhat run ./tools/deployVerifier/deployVerifier.ts --network sepolia
+npx hardhat run ./tools/deployVerifier/deployVerifier.ts --network
```
+- Output:
+ - `deploy_verifier_output.json`:
+ ```
+ {
+ "deployer": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "verifier": "FflonkVerifier_12",
+ "verifierContract": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8"
+ }
+ ```
+ - logs:
+ ```
+ --> Deploying with: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ --> Deploying verifier: FflonkVerifier_12
+
+ #######################
+ Verifier deployed to: 0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9
+ #######################
+
+ #######################
+ you can verify the new verifierContract address with the following command:
+ npx hardhat verify 0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9 --network localhost
+ #######################
+ ```
\ No newline at end of file
diff --git a/tools/deployVerifier/deployVerifier.ts b/tools/deployVerifier/deployVerifier.ts
index 89a1eecbb..ae2845fa4 100644
--- a/tools/deployVerifier/deployVerifier.ts
+++ b/tools/deployVerifier/deployVerifier.ts
@@ -8,6 +8,7 @@ import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../../.env")});
import {ethers, upgrades} from "hardhat";
const deployParameters = require("./deploy_verifier_parameters.json");
+const pathOutput = path.resolve(__dirname, "./deploy_verifier_output.json")
async function main() {
// Load provider
@@ -74,6 +75,11 @@ async function main() {
verifierContract = await VerifierRollupHelperFactory.deploy();
await verifierContract.waitForDeployment();
}
+ const outputJson = {
+ deployer: deployer.address,
+ verifier: verifierName,
+ verifierContract: verifierContract.target
+ };
// print contract address deployed
console.log("\n#######################");
console.log("Verifier deployed to:", verifierContract.target);
@@ -83,6 +89,8 @@ async function main() {
console.log("you can verify the new verifierContract address with the following command:");
console.log(`npx hardhat verify ${verifierContract.target} --network ${process.env.HARDHAT_NETWORK}`);
console.log("#######################");
+
+ await fs.writeFileSync(pathOutput, JSON.stringify(outputJson, null, 1));
}
main().catch((e) => {
diff --git a/tools/deployVerifier/deploy_verifier_parameters.example b/tools/deployVerifier/deploy_verifier_parameters.json.example
similarity index 88%
rename from tools/deployVerifier/deploy_verifier_parameters.example
rename to tools/deployVerifier/deploy_verifier_parameters.json.example
index 7234d1595..a15b9852b 100644
--- a/tools/deployVerifier/deploy_verifier_parameters.example
+++ b/tools/deployVerifier/deploy_verifier_parameters.json.example
@@ -1,6 +1,6 @@
{
"realVerifier": true,
- "forkID": 10,
+ "forkID": 12,
"deployerPvtKey": "",
"maxFeePerGas":"",
"maxPriorityFeePerGas":"",
diff --git a/tools/getRollupData/.gitignore b/tools/getRollupData/.gitignore
new file mode 100644
index 000000000..655a5338e
--- /dev/null
+++ b/tools/getRollupData/.gitignore
@@ -0,0 +1,3 @@
+create_rollup_output*
+deploy_output.json
+rollupDataParams.json
\ No newline at end of file
diff --git a/tools/getRollupData/README.md b/tools/getRollupData/README.md
new file mode 100644
index 000000000..503ca59e1
--- /dev/null
+++ b/tools/getRollupData/README.md
@@ -0,0 +1,54 @@
+# Get Rollup Data
+Script to get rollup data.
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `rollupDataParams.json`:
+ - `polygonRollupManagerAddress`: rollupManager address,
+ - `rollupID`: rollup ID
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+> All paths are from root repository
+
+## Usage
+> All commands are done from root repository.
+
+- Copy configuration file:
+```
+cp tools/getRollupData/rollupDataParams.json.example tools/getRollupData/rollupDataParams.json
+```
+- Set your parameters
+- Run tool:
+```
+npx hardhat run tools/getRollupData/getRollupData.ts --network
+```
+- Output:
+ - `deploy_output.json`:
+ ```
+ {
+ "polygonRollupManagerAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0",
+ "polygonZkEVMBridgeAddress": "0x124fBB77374f2D2F0d716973C23Ab06AE49ACde5",
+ "polygonZkEVMGlobalExitRootAddress": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788",
+ "polTokenAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3",
+ "deploymentRollupManagerBlockNumber": 43
+ }
+ ```
+
+ - `create_rollup_output_X`:
+ ```
+ {
+ "genesis": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "createRollupBlockNumber": 49,
+ "rollupAddress": "0x1F708C24a0D3A740cD47cC0444E9480899f3dA7D",
+ "consensusContract": "0.0.1",
+ "rollupID": 1,
+ "L2ChainID": 1001,
+ "gasTokenAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"
+ }
+ ```
diff --git a/tools/getRollupData/getRollupData.ts b/tools/getRollupData/getRollupData.ts
index b5b66d72e..de43c7f4e 100644
--- a/tools/getRollupData/getRollupData.ts
+++ b/tools/getRollupData/getRollupData.ts
@@ -10,7 +10,7 @@ import {ethers, upgrades} from "hardhat";
const getRollupParams = require("./rollupDataParams.json");
import {PolygonRollupManager} from "../../typechain-types";
const pathOutputJson = path.join(__dirname, "./deploy_output.json");
-const pathCreateRollupOutput = path.join(__dirname, "./create_rollup_output.json");
+const pathCreateRollupOutput = path.join(__dirname, "./create_rollup_output");
async function main() {
const RollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
@@ -22,16 +22,22 @@ async function main() {
const polygonZkEVMBridgeAddress = await rollupManager.bridgeAddress();
const polygonZkEVMGlobalExitRootAddress = await rollupManager.globalExitRootManager();
const polTokenAddress = await rollupManager.pol();
-
- // FIlter first rollup ID ( the one on migration)
+ // Filter first rollup ID ( the one on migration)
const filterInit = rollupManager.filters.Initialized(undefined);
const eventsInit = await rollupManager.queryFilter(filterInit, 0, "latest");
const deploymentRollupManagerBlockNumber = eventsInit[0].blockNumber;
-
+
// Filter first initialization (deployment)
const filter = rollupManager.filters.AddExistingRollup(1);
const eventsAddRollup = await rollupManager.queryFilter(filter, 0, "latest");
- const upgradeToULxLyBlockNumber = eventsAddRollup[0].blockNumber;
+ let upgradeToULxLyBlockNumber;
+ if (eventsAddRollup.length > 0) {
+ upgradeToULxLyBlockNumber = eventsAddRollup[0].blockNumber;
+ } else {
+ console.log("No event AddExistingRollup");
+ upgradeToULxLyBlockNumber = eventsInit[0].blockNumber;
+ }
+
const deployOutput = {
polygonRollupManagerAddress: rollupManager.target,
polygonZkEVMBridgeAddress,
@@ -50,31 +56,36 @@ async function main() {
undefined
);
const eventsCreateNewRollup = await rollupManager.queryFilter(filter2, 0, "latest");
- const {rollupID, rollupAddress, chainID, gasTokenAddress, rollupTypeID} = eventsCreateNewRollup[0].args;
- const filter3 = rollupManager.filters.AddNewRollupType(
- rollupTypeID,
- undefined,
- undefined,
- undefined,
- undefined,
- undefined
- );
+ if (eventsCreateNewRollup.length > 0) {
+ const {rollupID, rollupAddress, chainID, gasTokenAddress, rollupTypeID} = eventsCreateNewRollup[0].args;
+
+ const filter3 = rollupManager.filters.AddNewRollupType(
+ rollupTypeID,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined
+ );
- const eventsAddRollupType = await rollupManager.queryFilter(filter3, 0, "latest");
- const {forkID, genesis, description} = eventsAddRollupType[0].args;
+ const eventsAddRollupType = await rollupManager.queryFilter(filter3, 0, "latest");
+ const {forkID, genesis, description} = eventsAddRollupType[0].args;
- // Add the first batch of the created rollup
- const outputCreateRollup = {} as any;
- outputCreateRollup.genesis = genesis;
- outputCreateRollup.createRollupBlockNumber = eventsCreateNewRollup[0].blockNumber;
- outputCreateRollup.rollupAddress = rollupAddress;
- outputCreateRollup.consensusContract = description;
- outputCreateRollup.rollupID = Number(rollupID);
- outputCreateRollup.L2ChainID = Number(chainID);
- outputCreateRollup.gasTokenAddress = gasTokenAddress;
+ // Add the first batch of the created rollup
+ const outputCreateRollup = {} as any;
+ outputCreateRollup.genesis = genesis;
+ outputCreateRollup.createRollupBlockNumber = eventsCreateNewRollup[0].blockNumber;
+ outputCreateRollup.rollupAddress = rollupAddress;
+ outputCreateRollup.consensusContract = description;
+ outputCreateRollup.rollupID = Number(rollupID);
+ outputCreateRollup.L2ChainID = Number(chainID);
+ outputCreateRollup.gasTokenAddress = gasTokenAddress;
- fs.writeFileSync(pathCreateRollupOutput, JSON.stringify(outputCreateRollup, null, 1));
+ await fs.writeFileSync(`${pathCreateRollupOutput}_${rollupID}.json`, JSON.stringify(outputCreateRollup, null, 1));
+ } else {
+ console.log("No event CreateNewRollup");
+ }
}
main().catch((e) => {
diff --git a/tools/grantRole/.gitignore b/tools/grantRole/.gitignore
new file mode 100644
index 000000000..dc198fa26
--- /dev/null
+++ b/tools/grantRole/.gitignore
@@ -0,0 +1,2 @@
+grantRoleOutput.json
+grantRole.json
\ No newline at end of file
diff --git a/tools/grantRole/README.md b/tools/grantRole/README.md
new file mode 100644
index 000000000..c264af6fe
--- /dev/null
+++ b/tools/grantRole/README.md
@@ -0,0 +1,62 @@
+# Get Rollup Data
+Script to get rollup data.
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `grantRole.json`:
+ - `roleName`:
+ - "ADD_ROLLUP_TYPE_ROLE"
+ - "OBSOLETE_ROLLUP_TYPE_ROLE"
+ - "CREATE_ROLLUP_ROLE"
+ - "ADD_EXISTING_ROLLUP_ROLE"
+ - "UPDATE_ROLLUP_ROLE"
+ - "TRUSTED_AGGREGATOR_ROLE"
+ - "TRUSTED_AGGREGATOR_ROLE_ADMIN"
+ - "SET_FEE_ROLE"
+ - "STOP_EMERGENCY_ROLE"
+ - "EMERGENCY_COUNCIL_ROLE"
+ - `accountToGrantRole`: address to grantRole
+ - `polygonRollupManagerAddress`: rollupManager address
+ - `timelockDelay`: timelock delay
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+> All paths are from root repository
+
+## Usage
+> All commands are done from root repository.
+
+- Copy configuration file:
+```
+cp ./tools/grantRole/grantRole.json.example ./tools/grantRole/grantRole.json
+```
+- Set your parameters
+- Run tool:
+```
+npx hardhat run tools/grantRole/grantRole.ts --network
+```
+- Output:
+ - `granRoleOutput.json`:
+ ```
+ {
+ "scheduleData": "0x01d5062a000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000000442f2ff15dac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c000000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d3000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442f2ff15dac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c000000000000000000000000000000000000000000000000000000000",
+ "decodedScheduleData": {
+ "target": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0",
+ "value": "0",
+ "data": "0x2f2ff15dac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590000000000000000000000000a51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0",
+ "decodedData": {
+ "role": "0xac75d24dbb35ea80e25fab167da4dea46c1915260426570db84f184891f5f590",
+ "account": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "3600"
+ }
+ }
+ ```
diff --git a/tools/grantRole/grantRole.json.example b/tools/grantRole/grantRole.json.example
index fc6189db1..2264e6ada 100644
--- a/tools/grantRole/grantRole.json.example
+++ b/tools/grantRole/grantRole.json.example
@@ -2,9 +2,5 @@
"roleName": "roleName",
"accountToGrantRole": "0xaddress",
"polygonRollupManagerAddress": "0xaddress",
- "timelockDelay": 3600,
- "deployerPvtKey": "",
- "maxFeePerGas": "",
- "maxPriorityFeePerGas": "",
- "multiplierGas": ""
+ "timelockDelay": 3600
}
diff --git a/tools/grantRole/grantRole.ts b/tools/grantRole/grantRole.ts
index d9c5f91bd..a486fb741 100644
--- a/tools/grantRole/grantRole.ts
+++ b/tools/grantRole/grantRole.ts
@@ -54,59 +54,11 @@ async function main() {
}
const roleID = ethers.id(roleName);
- // Load provider
- let currentProvider = ethers.provider;
- if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) {
- if (process.env.HARDHAT_NETWORK !== "hardhat") {
- currentProvider = ethers.getDefaultProvider(
- `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
- ) as any;
- if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) {
- console.log(
- `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei`
- );
- const FEE_DATA = new ethers.FeeData(
- null,
- ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"),
- ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei")
- );
-
- currentProvider.getFeeData = async () => FEE_DATA;
- } else {
- console.log("Multiplier gas used: ", addRollupParameters.multiplierGas);
- async function overrideFeeData() {
- const feedata = await ethers.provider.getFeeData();
- return new ethers.FeeData(
- null,
- ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n,
- ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n
- );
- }
- currentProvider.getFeeData = overrideFeeData;
- }
- }
- }
-
- // Load deployer
- let deployer;
- if (addRollupParameters.deployerPvtKey) {
- deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider);
- } else if (process.env.MNEMONIC) {
- deployer = ethers.HDNodeWallet.fromMnemonic(
- ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
- "m/44'/60'/0'/0/0"
- ).connect(currentProvider);
- } else {
- [deployer] = await ethers.getSigners();
- }
-
- console.log("Using with: ", deployer.address);
-
// load timelock
- const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock");
// Load Rollup manager
- const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager");
const operation = genOperation(
polygonRollupManagerAddress,
@@ -142,8 +94,8 @@ async function main() {
// Decode the scheduleData for better readibility
const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
- const paramsArray = timelockTx?.fragment.inputs;
- const objectDecoded = {};
+ const paramsArray = timelockTx?.fragment.inputs as any;
+ const objectDecoded = {} as any;
for (let i = 0; i < paramsArray?.length; i++) {
const currentParam = paramsArray[i];
@@ -153,8 +105,8 @@ async function main() {
const decodedRollupManagerData = PolgonRollupManagerFactory.interface.parseTransaction({
data: timelockTx?.args[i],
});
- const objectDecodedData = {};
- const paramsArrayData = decodedRollupManagerData?.fragment.inputs;
+ const objectDecodedData = {} as any;
+ const paramsArrayData = decodedRollupManagerData?.fragment.inputs as any;
for (let j = 0; j < paramsArrayData?.length; j++) {
const currentParam = paramsArrayData[j];
diff --git a/tools/updateRollup/.gitignore b/tools/updateRollup/.gitignore
new file mode 100644
index 000000000..f9604b070
--- /dev/null
+++ b/tools/updateRollup/.gitignore
@@ -0,0 +1,2 @@
+updateRollupOutput-*.json
+updateRollup.json
\ No newline at end of file
diff --git a/tools/updateRollup/README.md b/tools/updateRollup/README.md
new file mode 100644
index 000000000..36f6d158b
--- /dev/null
+++ b/tools/updateRollup/README.md
@@ -0,0 +1,68 @@
+# Update rollup
+Script to deploy call `updateRollup` function in the `PolygonRollupManager.sol` smart contract.
+
+## Install
+```
+npm i
+```
+
+## Setup
+### updateRollup
+- Config file
+ - `type`: Specify the type of rollup creation, only available:
+ - `EOA`: If creating the rollup from a wallet, the script will execute the creation of the rollup on the specified network
+ - `Multisig`: If creating the rollup from a multisig, the script will output the calldata of the transaction to execute for creating the rollup
+ - `Timelock`: If creating the rollup through a timelock, the script will output the execute and schedule data to send to the timelock contract
+ - `polygonRollupManagerAddress`: `PolygonRollupManager.sol` SC address
+ - `timelockDelay (optional)`: at least it should be the minimum delay of the timelock smart contract
+ - `deployerPvtKey`: private key deployer
+ - First option will load `deployerPvtKey`. Otherwise, `process.env.MNEMONIC` will be loaded from the `.env` file
+ - `maxFeePerGas`: set custom gas
+ - `maxPriorityFeePerGas`: set custom gas
+ - `multiplierGas`: set custom gas
+- A network should be selected when running the script
+ - examples: `-- sepolia` or `--mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+ - `rollups`, array where for each rollup:
+ - `rollupAddress`: rollup address of the rollup that is going to be updated
+ - `newRollupTypeID`: select which is the `rollupTypeID` to upgrade
+ - `upgradeData`: data necessary to perform the upgrade (default to `0x`)
+> All paths are from root repository
+
+## Usage
+> All commands are done from root repository.
+
+### Call 'updateRollup'
+- Copy configuration file:
+```
+cp ./tools/updateRollup/updateRollup.json.example ./tools/updateRollup/updateRollup.json
+```
+
+- Set your parameters
+- Run tool:
+```
+npx hardhat run ./tools/updateRollup/updateRollup.ts --network
+```
+
+### 'updateRollup' from an EOA
+
+Running the tool, the updateRollup transaction will be sent directly
+
+### 'updateRollup' Multisig
+
+- Output: Transaction to update the rollup
+
+### Generate 'updateRollup' data to the Timelock SC
+- Set your parameters
+- Run tool:
+```
+npx hardhat run ./tools/updateRollup/updateRollupTimelock.ts --network
+```
+- Output:
+ - scheduleData
+ - executeData
+> send data to the timelock contract address:
+> - use your favourite browser extension
+> - send tx to timelock address with hex data as `scheduleData`
+> - wait `timelockDelay` and then send `executeData` to timelock address
diff --git a/tools/updateRollup/updateRollup.json.example b/tools/updateRollup/updateRollup.json.example
index fda30151f..38534ceb4 100644
--- a/tools/updateRollup/updateRollup.json.example
+++ b/tools/updateRollup/updateRollup.json.example
@@ -1,11 +1,16 @@
{
- "rollupAddress": "0xaddress",
- "newRollupTypeID": 1,
- "upgradeData": "0x",
+ "type": "EOA",
"polygonRollupManagerAddress": "0xaddress",
"timelockDelay": 0,
"deployerPvtKey": "",
"maxFeePerGas": "",
"maxPriorityFeePerGas": "",
- "multiplierGas": ""
-}
+ "multiplierGas": "",
+ "rollups": [
+ {
+ "rollupAddress": "0xaddress",
+ "newRollupTypeID": 1,
+ "upgradeData": "0x"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tools/updateRollup/updateRollup.ts b/tools/updateRollup/updateRollup.ts
index efb7746be..5c1563881 100644
--- a/tools/updateRollup/updateRollup.ts
+++ b/tools/updateRollup/updateRollup.ts
@@ -1,70 +1,75 @@
/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
-import {expect} from "chai";
import path = require("path");
import fs = require("fs");
import * as dotenv from "dotenv";
dotenv.config({path: path.resolve(__dirname, "../../.env")});
-import {ethers} from "hardhat";
+import {ethers, network} from "hardhat";
-const addRollupParameters = require("./updateRollup.json");
-
-const pathOutputJson = path.join(__dirname, "./updateRollupOutput.json");
+const updateRollupsParameters = require("./updateRollup.json");
+const dateStr = new Date().toISOString();
+const pathOutputJson = path.join(__dirname, `./updateRollupOutput-${dateStr}.json`);
+import {PolygonRollupManager} from "../../typechain-types";
+import { transactionTypes, genOperation } from "../utils";
import "../../deployment/helpers/utils";
async function main() {
- const outputJson = {} as any;
-
/*
- * Check deploy parameters
+ * Check parameters
* Check that every necessary parameter is fullfilled
*/
const mandatoryDeploymentParameters = [
- "rollupAddress",
- "newRollupTypeID",
- "upgradeData",
+ "type",
"polygonRollupManagerAddress",
- "timelockDelay",
];
+ // check create rollup type
+ switch (updateRollupsParameters.type) {
+ case transactionTypes.EOA:
+ case transactionTypes.MULTISIG:
+ break;
+ case transactionTypes.TIMELOCK:
+ mandatoryDeploymentParameters.push("timelockDelay");
+ break;
+ default:
+ throw new Error(`Invalid type ${updateRollupsParameters.type}`);
+ }
+
for (const parameterName of mandatoryDeploymentParameters) {
- if (addRollupParameters[parameterName] === undefined || addRollupParameters[parameterName] === "") {
+ if (updateRollupsParameters[parameterName] === undefined || updateRollupsParameters[parameterName] === "") {
throw new Error(`Missing parameter: ${parameterName}`);
}
}
-
- const {rollupAddress, newRollupTypeID, upgradeData, polygonRollupManagerAddress, timelockDelay} =
- addRollupParameters;
-
- const salt = addRollupParameters.timelockSalt || ethers.ZeroHash;
+ console.log(`Starting script to update rollup from ${updateRollupsParameters.type}`)
// Load provider
let currentProvider = ethers.provider;
- if (addRollupParameters.multiplierGas || addRollupParameters.maxFeePerGas) {
+ if (updateRollupsParameters.multiplierGas || updateRollupsParameters.maxFeePerGas) {
if (process.env.HARDHAT_NETWORK !== "hardhat") {
currentProvider = ethers.getDefaultProvider(
`https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
) as any;
- if (addRollupParameters.maxPriorityFeePerGas && addRollupParameters.maxFeePerGas) {
+ if (updateRollupsParameters.maxPriorityFeePerGas && updateRollupsParameters.maxFeePerGas) {
console.log(
- `Hardcoded gas used: MaxPriority${addRollupParameters.maxPriorityFeePerGas} gwei, MaxFee${addRollupParameters.maxFeePerGas} gwei`
+ `Hardcoded gas used: MaxPriority${updateRollupsParameters.maxPriorityFeePerGas} gwei, MaxFee${updateRollupsParameters.maxFeePerGas} gwei`
);
const FEE_DATA = new ethers.FeeData(
null,
- ethers.parseUnits(addRollupParameters.maxFeePerGas, "gwei"),
- ethers.parseUnits(addRollupParameters.maxPriorityFeePerGas, "gwei")
+ ethers.parseUnits(updateRollupsParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(updateRollupsParameters.maxPriorityFeePerGas, "gwei")
);
currentProvider.getFeeData = async () => FEE_DATA;
} else {
- console.log("Multiplier gas used: ", addRollupParameters.multiplierGas);
+ console.log("Multiplier gas used: ", updateRollupsParameters.multiplierGas);
async function overrideFeeData() {
const feedata = await ethers.provider.getFeeData();
return new ethers.FeeData(
null,
- ((feedata.maxFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n,
- ((feedata.maxPriorityFeePerGas as bigint) * BigInt(addRollupParameters.multiplierGas)) / 1000n
+ ((feedata.maxFeePerGas as bigint) * BigInt(updateRollupsParameters.multiplierGas)) / 1000n,
+ ((feedata.maxPriorityFeePerGas as bigint) * BigInt(updateRollupsParameters.multiplierGas)) /
+ 1000n
);
}
currentProvider.getFeeData = overrideFeeData;
@@ -74,8 +79,8 @@ async function main() {
// Load deployer
let deployer;
- if (addRollupParameters.deployerPvtKey) {
- deployer = new ethers.Wallet(addRollupParameters.deployerPvtKey, currentProvider);
+ if (updateRollupsParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(updateRollupsParameters.deployerPvtKey, currentProvider);
} else if (process.env.MNEMONIC) {
deployer = ethers.HDNodeWallet.fromMnemonic(
ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
@@ -87,96 +92,178 @@ async function main() {
console.log("Using with: ", deployer.address);
- // load timelock
- const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
-
+ const { polygonRollupManagerAddress } = updateRollupsParameters;
+
// Load Rollup manager
const PolgonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const rollupManagerContract = PolgonRollupManagerFactory.attach(
+ polygonRollupManagerAddress
+ ) as PolygonRollupManager;
- const operation = genOperation(
- polygonRollupManagerAddress,
- 0, // value
- PolgonRollupManagerFactory.interface.encodeFunctionData("updateRollup", [
- rollupAddress,
- newRollupTypeID,
- upgradeData,
- ]),
- ethers.ZeroHash, // predecesoor
- salt // salt
- );
-
- // Schedule operation
- const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [
- operation.target,
- operation.value,
- operation.data,
- operation.predecessor,
- operation.salt,
- timelockDelay,
- ]);
- // Execute operation
- const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [
- operation.target,
- operation.value,
- operation.data,
- operation.predecessor,
- operation.salt,
- ]);
-
- console.log({scheduleData});
- console.log({executeData});
-
- outputJson.scheduleData = scheduleData;
- outputJson.executeData = executeData;
-
- // Decode the scheduleData for better readibility
- const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
- const paramsArray = timelockTx?.fragment.inputs;
- const objectDecoded = {};
-
- for (let i = 0; i < paramsArray?.length; i++) {
- const currentParam = paramsArray[i];
-
- objectDecoded[currentParam.name] = timelockTx?.args[i];
-
- if (currentParam.name == "data") {
- const decodedRollupManagerData = PolgonRollupManagerFactory.interface.parseTransaction({
- data: timelockTx?.args[i],
- });
- const objectDecodedData = {};
- const paramsArrayData = decodedRollupManagerData?.fragment.inputs;
-
- for (let j = 0; j < paramsArrayData?.length; j++) {
- const currentParam = paramsArrayData[j];
- objectDecodedData[currentParam.name] = decodedRollupManagerData?.args[j];
+ const outputsJson = [] as any;
+
+ // Timelock vars
+ const operations = {} as any;
+ operations.target = [];
+ operations.value = [];
+ operations.data = [];
+ const predecessor = ethers.ZeroHash;
+ const salt = updateRollupsParameters.timelockSalt || ethers.ZeroHash;
+
+ if(updateRollupsParameters.rollups.length === 0) {
+ throw new Error("No rollups")
+ } else {
+ for(let i = 0; i < updateRollupsParameters.rollups.length; i++) {
+ const outputJson = {} as any;
+ const updateRollupParameters = updateRollupsParameters.rollups[i];
+ /*
+ * Check parameters
+ * Check that every necessary parameter is fullfilled
+ */
+ const mandatoryParametersRollup = [
+ "rollupAddress",
+ "newRollupTypeID",
+ "upgradeData",
+ ];
+
+ for (const parameterName of mandatoryParametersRollup) {
+ if (updateRollupParameters[parameterName] === undefined || updateRollupParameters[parameterName] === "") {
+ throw new Error(`Missing rollup[${i}] parameter: ${parameterName}`);
+ }
}
- objectDecoded["decodedData"] = objectDecodedData;
+
+ const {rollupAddress, newRollupTypeID, upgradeData} = updateRollupParameters;
+
+ outputJson.networkName = network.name;
+ outputJson.polygonRollupManagerAddress = polygonRollupManagerAddress;
+ outputJson.rollupAddress = rollupAddress;
+ outputJson.newRollupTypeID = newRollupTypeID;
+ outputJson.upgradeData = upgradeData;
+
+ if(updateRollupsParameters.type === transactionTypes.EOA) {
+ // Check role
+ const UPDATE_ROLLUP_ROLE = ethers.id("UPDATE_ROLLUP_ROLE");
+ if ((await rollupManagerContract.hasRole(UPDATE_ROLLUP_ROLE, deployer.address)) == false) {
+ // log that address has no role
+ throw new Error(`Address ${deployer.address} does not have the UPDATE_ROLLUP_ROLE role`);
+ }
+ console.log(`Updating rollup ${rollupAddress}...`)
+ try {
+ console.log(await (await rollupManagerContract.updateRollup(rollupAddress, newRollupTypeID, upgradeData)).wait());
+ outputJson.successUpdate = true;
+ } catch (e) {
+ outputJson.successUpdate = false;
+ console.log(`Error updating ${rollupAddress}`);
+ console.log(e);
+ }
+
+ } else if(updateRollupsParameters.type === transactionTypes.TIMELOCK) {
+ console.log(`Creating timelock txs for update rollup ${rollupAddress}...`)
+ const operation = genOperation(
+ polygonRollupManagerAddress,
+ 0, // value
+ PolgonRollupManagerFactory.interface.encodeFunctionData("updateRollup", [
+ rollupAddress,
+ newRollupTypeID,
+ upgradeData,
+ ]),
+ predecessor, // predecessor
+ salt // salt
+ );
+ operations.target.push(operation.target);
+ operations.value.push(operation.value);
+ operations.data.push(operation.data);
+ } else {
+ console.log(`Creating calldata for update rollup from multisig ${rollupAddress}...`);
+ const txUpdateRollup = PolgonRollupManagerFactory.interface.encodeFunctionData("updateRollup", [
+ rollupAddress,
+ newRollupTypeID,
+ upgradeData,
+ ]);
+ outputJson.txUpdateRollup = txUpdateRollup;
+ }
+ outputsJson.push(outputJson);
}
- }
+
+ // if type === Timelock --> get scheduleData & executeData
+ if(updateRollupsParameters.type === transactionTypes.TIMELOCK){
+ console.log(`Get scheduleData & executeData...`)
+ const { timelockDelay } = updateRollupsParameters;
+ // load timelock
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+
+ // Schedule operation
+ const scheduleData = timelockContractFactory.interface.encodeFunctionData("scheduleBatch", [
+ operations.target,
+ operations.value,
+ operations.data,
+ predecessor,
+ salt,
+ timelockDelay,
+ ]);
+
+ // Execute operation
+ const executeData = timelockContractFactory.interface.encodeFunctionData("executeBatch", [
+ operations.target,
+ operations.value,
+ operations.data,
+ predecessor,
+ salt,
+ ]);
+
+ console.log({scheduleData});
+ console.log({executeData});
+
+ // Decode the scheduleData for better readibility
+ const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
+ const paramsArray = timelockTx?.fragment.inputs;
+ const objectDecoded = {};
- outputJson.decodedScheduleData = objectDecoded;
+ for (let i = 0; i < paramsArray?.length; i++) {
+ const currentParam = paramsArray[i];
+ objectDecoded[currentParam.name] = timelockTx?.args[i];
+
+ if (currentParam.name == "payloads") {
+ // for each payload
+ const payloads = timelockTx?.args[i];
+ for (let j = 0; j < payloads.length; j++) {
+ const data = payloads[j];
+ const decodedProxyAdmin = PolgonRollupManagerFactory.interface.parseTransaction({
+ data,
+ });
+
+ const resultDecodeProxyAdmin = {};
+ resultDecodeProxyAdmin.signature = decodedProxyAdmin?.signature;
+ resultDecodeProxyAdmin.selector = decodedProxyAdmin?.selector;
+
+ const paramsArrayData = decodedProxyAdmin?.fragment.inputs;
+
+ for (let n = 0; n < paramsArrayData?.length; n++) {
+ const currentParam = paramsArrayData[n];
+ resultDecodeProxyAdmin[currentParam.name] = decodedProxyAdmin?.args[n];
+ }
+ objectDecoded[`decodePayload_${j}`] = resultDecodeProxyAdmin;
+ }
+ }
+ }
+ const outputTimelock = {
+ rollups: outputsJson,
+ scheduleData,
+ executeData,
+ decodeScheduleData: objectDecoded,
+ }
- fs.writeFileSync(pathOutputJson, JSON.stringify(outputJson, null, 1));
+ fs.writeFileSync(pathOutputJson, JSON.stringify(outputTimelock, null, 1));
+ } else {
+ fs.writeFileSync(pathOutputJson, JSON.stringify(outputsJson, null, 1));
+ }
+
+ console.log("Finished script, output saved at: ", pathOutputJson)
+
+ }
}
main().catch((e) => {
console.error(e);
process.exit(1);
});
-
-// OZ test functions
-function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) {
- const abiEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
- ["address", "uint256", "bytes", "uint256", "bytes32"],
- [target, value, data, predecessor, salt]
- );
- const id = ethers.keccak256(abiEncoded);
- return {
- id,
- target,
- value,
- data,
- predecessor,
- salt,
- };
-}
diff --git a/tools/upgradePreEtrogGenesis/.gitignore b/tools/upgradePreEtrogGenesis/.gitignore
new file mode 100644
index 000000000..24cc9592b
--- /dev/null
+++ b/tools/upgradePreEtrogGenesis/.gitignore
@@ -0,0 +1 @@
+upgrade_pre_etrog_genesis.json
\ No newline at end of file
diff --git a/tools/upgradePreEtrogGenesis/README.md b/tools/upgradePreEtrogGenesis/README.md
new file mode 100644
index 000000000..be3b25871
--- /dev/null
+++ b/tools/upgradePreEtrogGenesis/README.md
@@ -0,0 +1,32 @@
+# Upgrade pre etrog genesis
+Script to migrate a non-LxLY genesis (previous genesis) to an LxLY genesis (etrog fork).
+
+## Install
+```
+npm i
+```
+
+## Setup
+- Config file `upgrade_pre_etrog_genesis.json`:
+ - `test`: bool, Indicate if it's a test deployment, which will fund the deployer address with pre minted ether and will give more powers to the deployer address to make easier the flow.
+ - `timelockAdminAddress`: address, Timelock owner address, able to send start an upgradeability process via timelock
+ - `minDelayTimelock`: number, Minimum timelock delay,
+ - `initialZkEVMDeployerOwner`: address, Initial owner of the `PolygonZkEVMDeployer`
+- A network should be selected when running the script
+ - examples: `--network sepolia` or `--network mainnet`
+ - This uses variables set in `hardhat.config.ts`
+ - Which uses some environment variables that should be set in `.env`
+
+## Usage
+
+- Copy configuration file:
+```
+cp ./tools/upgradePreEtrogGenesis/upgrade_pre_etrog_genesis.json.example ./tools/upgradePreEtrogGenesis/upgrade_pre_etrog_genesis.json
+```
+- Set your parameters
+- Run tool:
+```
+npx hardhat run ./tools/upgradePreEtrogGenesis/upgradePreEtrogGenesis.ts
+```
+
+- Output: `new_genesis.json`
\ No newline at end of file
diff --git a/tools/createGenesis/genesis_base.json b/tools/upgradePreEtrogGenesis/genesis_base.json
similarity index 100%
rename from tools/createGenesis/genesis_base.json
rename to tools/upgradePreEtrogGenesis/genesis_base.json
diff --git a/tools/upgradePreEtrogGenesis/new_genesis.json b/tools/upgradePreEtrogGenesis/new_genesis.json
new file mode 100644
index 000000000..3605ddf86
--- /dev/null
+++ b/tools/upgradePreEtrogGenesis/new_genesis.json
@@ -0,0 +1,92 @@
+{
+ "root": "0xe3a7d8bae497945ba8ddc51c69564f60ad4c1a990b9c7bdbd27f7929bfa8f272",
+ "genesis": [
+ {
+ "contractName": "PolygonZkEVMDeployer",
+ "balance": "0",
+ "nonce": "4",
+ "address": "0xCB19eDdE626906eB1EE52357a27F62dd519608C2",
+ "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000004c1665d6651ecefa59b9b3041951608468b18891"
+ }
+ },
+ {
+ "contractName": "ProxyAdmin",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000bba0935fa93eb23de7990b47f0d96a8f75766d13"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMBridge implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMBridge proxy",
+ "balance": "340282366920938463463374607431768211455",
+ "nonce": "1",
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000005ac4182a1dd41aeef465e40b82fd326bf66ab82c"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 implementation",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x0200143Fa295EE4dffEF22eE2616c2E008D81688",
+ "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002a3dd3eb832af982ec71669e178424b10dca2ede1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033"
+ },
+ {
+ "contractName": "PolygonZkEVMGlobalExitRootL2 proxy",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa",
+ "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033",
+ "storage": {
+ "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a",
+ "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x0000000000000000000000000200143fa295ee4dffef22ee2616c2e008d81688"
+ }
+ },
+ {
+ "contractName": "PolygonZkEVMTimelock",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0xBBa0935Fa93Eb23de7990b47F0D96a8f75766d13",
+ "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033",
+ "storage": {
+ "0x0000000000000000000000000000000000000000000000000000000000000002": "0x00000000000000000000000000000000000000000000000000000000000d2f00",
+ "0xb7dfbbca55dd7b7b40403b7620ec95da956b60d562518460548c310b9ba22ee5": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x9fa2d8034dbcb437bee38d61fbd100910e1342ffc07f128aa1b8e6790b7f3f68": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x8af78a811b91830f719aeb3279e6ef47b4b581bcf168d6d9015d376b23a240bc": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x9b56cc8bdadd190ab692f9895be09d0edc2ddf428710bebe53c4911e5bc08f42": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5",
+ "0x74be529e918f2e5719738045bde8f05a9e9498aace6df8d886a992d046f546a1": "0x0000000000000000000000000000000000000000000000000000000000000001",
+ "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5"
+ }
+ },
+ {
+ "accountName": "keyless Deployer",
+ "balance": "0",
+ "nonce": "1",
+ "address": "0x9d90066e7478496e2284E54c3548106bb4F90E50"
+ },
+ {
+ "accountName": "deployer",
+ "balance": "0",
+ "nonce": "8",
+ "address": "0x4c1665d6651ecEfa59B9B3041951608468b18891"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tools/createGenesis/generateGenesis.ts b/tools/upgradePreEtrogGenesis/upgradePreEtrogGenesis.ts
similarity index 98%
rename from tools/createGenesis/generateGenesis.ts
rename to tools/upgradePreEtrogGenesis/upgradePreEtrogGenesis.ts
index 591c01396..3d8f5667c 100644
--- a/tools/createGenesis/generateGenesis.ts
+++ b/tools/upgradePreEtrogGenesis/upgradePreEtrogGenesis.ts
@@ -29,7 +29,7 @@ import {ProxyAdmin} from "../../typechain-types";
import {Addressable} from "ethers";
import "../../deployment/helpers/utils";
-const deployParameters = require("./deploy_parameters.json");
+const genesisParameters = require("./upgrade_pre_etrog_genesis.json");
const genesisBase = require("./genesis_base.json");
const pathOutputJson = path.join(__dirname, argv.out);
@@ -72,9 +72,9 @@ const keylessDeployerMainnet = baseGenesisInfo.find(
const deployerMainnet = baseGenesisInfo.find((account: any) => account.accountName === "deployer").address;
-const mainnetMultisig = deployParameters.timelockAddress;
-const mainnetInitialZkEVMDeployerOwner = deployParameters.initialZkEVMDeployerOwner;
-const mainnetMinDelayTimelock = deployParameters.minDelayTimelock;
+const mainnetMultisig = genesisParameters.timelockAddress;
+const mainnetInitialZkEVMDeployerOwner = genesisParameters.initialZkEVMDeployerOwner;
+const mainnetMinDelayTimelock = genesisParameters.minDelayTimelock;
const globalExitRootL2Address = "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa";
const zkevmAddressL2 = ethers.ZeroAddress;
@@ -383,7 +383,7 @@ async function main() {
address: finalDeployer,
});
- if (deployParameters.test) {
+ if (genesisParameters.test) {
// Add tester account with ether
genesis[genesis.length - 1].balance = "100000000000000000000000";
}
diff --git a/tools/upgradePreEtrogGenesis/upgrade_pre_etrog_genesis.json.example b/tools/upgradePreEtrogGenesis/upgrade_pre_etrog_genesis.json.example
new file mode 100644
index 000000000..b8fe8ff3e
--- /dev/null
+++ b/tools/upgradePreEtrogGenesis/upgrade_pre_etrog_genesis.json.example
@@ -0,0 +1,6 @@
+{
+ "timelockAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "initialZkEVMDeployerOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "minDelayTimelock": 3600,
+ "test": true
+}
\ No newline at end of file
diff --git a/tools/utils.js b/tools/utils.js
new file mode 100644
index 000000000..76454e868
--- /dev/null
+++ b/tools/utils.js
@@ -0,0 +1,81 @@
+/* eslint-disable no-prototype-builtins */
+/* eslint-disable no-restricted-syntax */
+const ethers = require('ethers');
+
+const supportedBridgeContracts = ['PolygonZkEVMBridgeV2 proxy', 'PolygonZkEVMBridge proxy', 'BridgeL2SovereignChain proxy'];
+
+function genOperation(target, value, data, predecessor, salt) {
+ const abiEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
+ ['address', 'uint256', 'bytes', 'uint256', 'bytes32'],
+ [target, value, data, predecessor, salt],
+ );
+ const id = ethers.keccak256(abiEncoded);
+ return {
+ id,
+ target,
+ value,
+ data,
+ predecessor,
+ salt,
+ };
+}
+
+const transactionTypes = {
+ EOA: 'EOA',
+ MULTISIG: 'Multisig',
+ TIMELOCK: 'Timelock',
+};
+
+// Function to recursively convert BigInts to Numbers
+function convertBigIntsToNumbers(obj) {
+ if (typeof obj === 'bigint') {
+ if (obj > BigInt(Number.MAX_SAFE_INTEGER)) {
+ throw new Error(`convertBigIntsToNumbers: BigInt exceeds maximum safe integer: ${obj}`);
+ }
+ return Number(obj); // Convert BigInt to Number
+ }
+
+ if (Array.isArray(obj)) {
+ return obj.map(convertBigIntsToNumbers); // Recursively process each element in the array
+ }
+
+ if (typeof obj === 'object' && obj !== null) {
+ const newObj = {};
+ for (const key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ newObj[key] = convertBigIntsToNumbers(obj[key]); // Recursively process each property
+ }
+ }
+ return newObj;
+ }
+
+ return obj; // Return the value if it's not a BigInt, object, or array
+}
+
+function checkBridgeAddress(genesis, expectedBridgeAddress){
+ // get bridge address in genesis file
+ let genesisBridgeAddress = ethers.ZeroAddress;
+ let bridgeContractName = "";
+
+ for (let i = 0; i < genesis.genesis.length; i++) {
+ if (supportedBridgeContracts.includes(genesis.genesis[i].contractName)) {
+ genesisBridgeAddress = genesis.genesis[i].address;
+ bridgeContractName = genesis.genesis[i].contractName;
+ break;
+ }
+ }
+
+ if (expectedBridgeAddress.toLowerCase() !== genesisBridgeAddress.toLowerCase()) {
+ throw new Error(
+ `checkBridgeAddress: '${bridgeContractName}' address in the 'genesis.json' does not match the 'expectedBridgeAddress'`
+ );
+ }
+}
+
+module.exports = {
+ genOperation,
+ transactionTypes,
+ convertBigIntsToNumbers,
+ supportedBridgeContracts,
+ checkBridgeAddress,
+};
diff --git a/tools/verify-etherscan/.gitignore b/tools/verify-etherscan/.gitignore
new file mode 100644
index 000000000..9079d7157
--- /dev/null
+++ b/tools/verify-etherscan/.gitignore
@@ -0,0 +1 @@
+arguments.js
\ No newline at end of file
diff --git a/tools/verify-etherscan/README.md b/tools/verify-etherscan/README.md
new file mode 100644
index 000000000..f20057019
--- /dev/null
+++ b/tools/verify-etherscan/README.md
@@ -0,0 +1,11 @@
+# Verify etherscan
+This is just an example of the `arguments.js` file to provide in etherscan verification command using hardhat.
+- Copy example file:
+```
+cp arguments.js.example arguments.js
+```
+- Update arguments.js
+- Run hardhat command:
+```
+npx hardhat verify --constructor-args tools/verify-etherscan/arguments.js ${address} --network ${network-name}
+```
\ No newline at end of file
diff --git a/tools/verify-etherscan/arguments.js.example b/tools/verify-etherscan/arguments.js.example
new file mode 100644
index 000000000..72c7116c5
--- /dev/null
+++ b/tools/verify-etherscan/arguments.js.example
@@ -0,0 +1,8 @@
+module.exports = [
+ '0x6407cf296a27B38fd29c401518504D388F1DFB3d',
+ '0xF1b13757bcF3EF902a7847f409A6068BA43a89D4',
+ '0x4ceB990D2E2ee6d0e163fa80d12bac72C0F28D52',
+ '0xcFA773Cc48FBde3CA4D24eeCb19D224d697026b2',
+ 1440,
+ 2
+]
\ No newline at end of file
diff --git a/upgrade/upgradeBanana/mainnnet-info/mainnet.json b/upgrade/upgradeBanana/mainnnet-info/mainnet.json
new file mode 100644
index 000000000..cb143965b
--- /dev/null
+++ b/upgrade/upgradeBanana/mainnnet-info/mainnet.json
@@ -0,0 +1,3344 @@
+{
+ "manifestVersion": "3.2",
+ "admin": {
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A"
+ },
+ "proxies": [
+ {
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb",
+ "txHash": "0x9946be78d6c6d19dd1c6c7134a8fac27e76d32cad36dae2398d28fe6ff838f10",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "txHash": "0xe34243804e1f7257acb09c97d0d6f023663200c39ee85a1e6927b0b391710bbb",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "7d81d3d49439b439759dc4a136c30bff477402e06213014f3132a9b83751e779": {
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "_status",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_uint256",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:25"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "83",
+ "type": "t_uint256",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:28"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "84",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:34"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "94",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "networkID",
+ "offset": 1,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:51"
+ },
+ {
+ "label": "globalExitRootManager",
+ "offset": 5,
+ "slot": "104",
+ "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:54"
+ },
+ {
+ "label": "lastUpdatedDepositCount",
+ "offset": 25,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:57"
+ },
+ {
+ "label": "claimedBitMap",
+ "offset": 0,
+ "slot": "105",
+ "type": "t_mapping(t_uint256,t_uint256)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:60"
+ },
+ {
+ "label": "tokenInfoToWrappedToken",
+ "offset": 0,
+ "slot": "106",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:63"
+ },
+ {
+ "label": "wrappedTokenToTokenInfo",
+ "offset": 0,
+ "slot": "107",
+ "type": "t_mapping(t_address,t_struct(TokenInformation)8241_storage)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:66"
+ },
+ {
+ "label": "polygonZkEVMaddress",
+ "offset": 0,
+ "slot": "108",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:69"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065": {
+ "label": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(TokenInformation)8241_storage)": {
+ "label": "mapping(address => struct PolygonZkEVMBridge.TokenInformation)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_uint256)": {
+ "label": "mapping(uint256 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(TokenInformation)8241_storage": {
+ "label": "struct PolygonZkEVMBridge.TokenInformation",
+ "members": [
+ {
+ "label": "originNetwork",
+ "type": "t_uint32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "originTokenAddress",
+ "type": "t_address",
+ "offset": 4,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "ce5f0c71bed14342c9985301ac01d3f106aecc5e1faee3ca7b5845eede57422f": {
+ "address": "0xbc1ea504fC54D078514eFCCA1F6860B5219B6BC3",
+ "txHash": "0x56b5e9a0955c816edefa8ab4cc057b7a41ef97c472c9027049c9353a01a8bea4",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:19"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:22"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:25"
+ }
+ ],
+ "types": {
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+ },
+ "4c7ed8ca43394b0ba1dd706ad28512fc2a3a8db4899762861bf5582c75c8b607": {
+ "address": "0xe262Ea2782e2e8dbFe354048c3B5d6DE9603EfEF",
+ "txHash": "0xc93e7884d6c7f6bf332cf154977f58840b1b0e82be46b2ee3ec04fd979e9a2bc",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5689_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5689_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5689_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5680_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "e0de5cb0e66c4e74b3f8f18ec5f07b6d781194a34a618b25f6325b5fe1ebfba3": {
+ "address": "0x301442aA888701c8B86727d42F3C55Fb0dd9eF7F",
+ "txHash": "0xeb9e883290a29cd74f2c8097b1f85b6b95d52733a9b6361b6c9f59a5513e0ec7",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ },
+ {
+ "label": "version",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5693_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5683_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "5cd0db59b0eeb57c4ea1d368b5b6558e055166c8d2d5b6a32c78020af986fb5e": {
+ "address": "0xb1585916487AcEdD99952086f2950763D253b923",
+ "txHash": "0x1e28f164ca48acc0766d1ef801f2852804a24704cda619ab762254ac22957612",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ },
+ {
+ "label": "version",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5693_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5683_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "79801cf42fb30168bed48ec167efe6a64d9c46e15685898f72431bb91455bb0a": {
+ "address": "0x0FeB850B183C57534b56b7d56520133C8f9BDB65",
+ "txHash": "0x4b0fb5c86ce3a7ba42a2ad487f838c50c1dd3102b9009d8d1b3dbc1d0ccbf98a",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "_status",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_uint256",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "83",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "84",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "94",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "networkID",
+ "offset": 1,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:61"
+ },
+ {
+ "label": "globalExitRootManager",
+ "offset": 5,
+ "slot": "104",
+ "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:64"
+ },
+ {
+ "label": "lastUpdatedDepositCount",
+ "offset": 25,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:67"
+ },
+ {
+ "label": "claimedBitMap",
+ "offset": 0,
+ "slot": "105",
+ "type": "t_mapping(t_uint256,t_uint256)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:70"
+ },
+ {
+ "label": "tokenInfoToWrappedToken",
+ "offset": 0,
+ "slot": "106",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:73"
+ },
+ {
+ "label": "wrappedTokenToTokenInfo",
+ "offset": 0,
+ "slot": "107",
+ "type": "t_mapping(t_address,t_struct(TokenInformation)2064_storage)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:76"
+ },
+ {
+ "label": "polygonRollupManager",
+ "offset": 0,
+ "slot": "108",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:80",
+ "renamedFrom": "polygonZkEVMaddress"
+ },
+ {
+ "label": "gasTokenAddress",
+ "offset": 0,
+ "slot": "109",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:83"
+ },
+ {
+ "label": "gasTokenNetwork",
+ "offset": 20,
+ "slot": "109",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:86"
+ },
+ {
+ "label": "gasTokenMetadata",
+ "offset": 0,
+ "slot": "110",
+ "type": "t_bytes_storage",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:89"
+ },
+ {
+ "label": "WETHToken",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_contract(TokenWrapped)2037",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:92"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_bytes_storage": {
+ "label": "bytes",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675": {
+ "label": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "numberOfBytes": "20"
+ },
+ "t_contract(TokenWrapped)2037": {
+ "label": "contract TokenWrapped",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(TokenInformation)2064_storage)": {
+ "label": "mapping(address => struct PolygonZkEVMBridgeV2.TokenInformation)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_uint256)": {
+ "label": "mapping(uint256 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(TokenInformation)2064_storage": {
+ "label": "struct PolygonZkEVMBridgeV2.TokenInformation",
+ "members": [
+ {
+ "label": "originNetwork",
+ "type": "t_uint32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "originTokenAddress",
+ "type": "t_address",
+ "offset": 4,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "0276720dd07b80a08f307a7d10b2a30c8973b8dad1bb0fef986ed1e3b6a2a9c4": {
+ "address": "0x2E38cD55163137483E30580Cb468C2dFf1d85077",
+ "txHash": "0xe15832f3a7bac8245a57bf658f49b60fb06e91b6c60645ac1489c5e04a76decf",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:14"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:17"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:21"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "35",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "36",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ }
+ ],
+ "types": {
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "55d2f394d0399c9e6e9a2e9773726fe47025d9e46193ddce8361a97fc7a550a6": {
+ "address": "0x3b82Da772c825283d85d5d6717A77C6Ff582053b",
+ "txHash": "0x19d27fa6f277e99c64a02af1a3d7532c24cabe58505f334ab98f8a5b7ac5d565",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_legacyOwner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29",
+ "renamedFrom": "_owner"
+ },
+ {
+ "label": "_roles",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "_legacyVerifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "_legacyMultiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_legacyTrustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53",
+ "renamedFrom": "trustedSequencer"
+ },
+ {
+ "label": "_legacyBatchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57",
+ "renamedFrom": "batchFee"
+ },
+ {
+ "label": "_legacyForcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64",
+ "renamedFrom": "forcedBatches"
+ },
+ {
+ "label": "_legacySequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69",
+ "renamedFrom": "sequencedBatches"
+ },
+ {
+ "label": "_legacyLastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73",
+ "renamedFrom": "lastTimestamp"
+ },
+ {
+ "label": "_legacylastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77",
+ "renamedFrom": "lastBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81",
+ "renamedFrom": "lastForceBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85",
+ "renamedFrom": "lastForceBatch"
+ },
+ {
+ "label": "_legacyLastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89",
+ "renamedFrom": "lastVerifiedBatch"
+ },
+ {
+ "label": "_legacyTrustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93",
+ "renamedFrom": "trustedAggregator"
+ },
+ {
+ "label": "_legacyBatchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98",
+ "renamedFrom": "batchNumToStateRoot"
+ },
+ {
+ "label": "_legacyTrustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102",
+ "renamedFrom": "trustedSequencerURL"
+ },
+ {
+ "label": "_legacyNetworkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106",
+ "renamedFrom": "networkName"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111",
+ "renamedFrom": "pendingStateTransitions"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115",
+ "renamedFrom": "lastPendingState"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119",
+ "renamedFrom": "lastPendingStateConsolidated"
+ },
+ {
+ "label": "_legacyPendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "_legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "_legacyAdmin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132",
+ "renamedFrom": "admin"
+ },
+ {
+ "label": "_legacyPendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136",
+ "renamedFrom": "pendingAdmin"
+ },
+ {
+ "label": "_legacyForceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140",
+ "renamedFrom": "forceBatchTimeout"
+ },
+ {
+ "label": "_legacyIsForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144",
+ "renamedFrom": "isForcedBatchDisallowed"
+ },
+ {
+ "label": "_legacyVersion",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148",
+ "renamedFrom": "version"
+ },
+ {
+ "label": "_legacyLastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152",
+ "renamedFrom": "lastVerifiedBatchBeforeUpgrade"
+ },
+ {
+ "label": "rollupTypeCount",
+ "offset": 0,
+ "slot": "126",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:170"
+ },
+ {
+ "label": "rollupTypeMap",
+ "offset": 0,
+ "slot": "127",
+ "type": "t_mapping(t_uint32,t_struct(RollupType)3613_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:173"
+ },
+ {
+ "label": "rollupCount",
+ "offset": 0,
+ "slot": "128",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:176"
+ },
+ {
+ "label": "rollupIDToRollupData",
+ "offset": 0,
+ "slot": "129",
+ "type": "t_mapping(t_uint32,t_struct(RollupData)3655_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:179"
+ },
+ {
+ "label": "rollupAddressToID",
+ "offset": 0,
+ "slot": "130",
+ "type": "t_mapping(t_address,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:182"
+ },
+ {
+ "label": "chainIDToRollupID",
+ "offset": 0,
+ "slot": "131",
+ "type": "t_mapping(t_uint64,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:186"
+ },
+ {
+ "label": "totalSequencedBatches",
+ "offset": 0,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:189"
+ },
+ {
+ "label": "totalVerifiedBatches",
+ "offset": 8,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:192"
+ },
+ {
+ "label": "lastAggregationTimestamp",
+ "offset": 16,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:195"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:199"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 0,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:202"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 8,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:206"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 16,
+ "slot": "133",
+ "type": "t_uint16",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:209"
+ },
+ {
+ "label": "_batchFee",
+ "offset": 0,
+ "slot": "134",
+ "type": "t_uint256",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:213"
+ },
+ {
+ "label": "lastDeactivatedEmergencyStateTimestamp",
+ "offset": 0,
+ "slot": "135",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:216"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IPolygonRollupBase)6982": {
+ "label": "contract IPolygonRollupBase",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IVerifierRollup)3495": {
+ "label": "contract IVerifierRollup",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint32)": {
+ "label": "mapping(address => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)": {
+ "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)7344_storage)": {
+ "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupData)3655_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupType)3613_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)": {
+ "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_uint32)": {
+ "label": "mapping(uint64 => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)7344_storage": {
+ "label": "struct LegacyZKEVMStateVariables.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(RoleData)7463_storage": {
+ "label": "struct PolygonAccessControlUpgradeable.RoleData",
+ "members": [
+ {
+ "label": "members",
+ "type": "t_mapping(t_address,t_bool)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "adminRole",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_struct(RollupData)3655_storage": {
+ "label": "struct PolygonRollupManager.RollupData",
+ "members": [
+ {
+ "label": "rollupContract",
+ "type": "t_contract(IPolygonRollupBase)6982",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "chainID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3495",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "sequencedBatches",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "lastLocalExitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingState",
+ "type": "t_uint64",
+ "offset": 16,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "type": "t_uint64",
+ "offset": 24,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "7"
+ },
+ {
+ "label": "rollupTypeID",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "7"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 16,
+ "slot": "7"
+ }
+ ],
+ "numberOfBytes": "256"
+ },
+ "t_struct(RollupType)3613_storage": {
+ "label": "struct PolygonRollupManager.RollupType",
+ "members": [
+ {
+ "label": "consensusImplementation",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3495",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 28,
+ "slot": "1"
+ },
+ {
+ "label": "obsolete",
+ "type": "t_bool",
+ "offset": 29,
+ "slot": "1"
+ },
+ {
+ "label": "genesis",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)7334_storage": {
+ "label": "struct LegacyZKEVMStateVariables.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "a3d4b058e74fe980dbf467091a7b6a272bb85c59e68bdcdacefe9389c98e3059": {
+ "address": "0x9Bdda421219900454E94e01d641fE64c60D8f4C8",
+ "txHash": "0x50dacd70e51e240a3996b61cc054934bdcbd896c426c1a9fcfe41e60f0685848",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:14"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:17"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:21"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "35",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "36",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ },
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "46",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "46",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "l1InfoRootMap",
+ "offset": 0,
+ "slot": "47",
+ "type": "t_mapping(t_uint32,t_bytes32)",
+ "contract": "PolygonZkEVMGlobalExitRootV2",
+ "src": "contracts/v2/PolygonZkEVMGlobalExitRootV2.sol:26"
+ }
+ ],
+ "types": {
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_bytes32)": {
+ "label": "mapping(uint32 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "e81dad715669290426e2ace87376be8949fd6f394237dc4ac4dedaf1cb234ee1": {
+ "address": "0x103388f5661d224F4aFb555C7E4a8FB52d0b752d",
+ "txHash": "0x5035aa7da7f57c8e83b1510d5a88ba511cf5a74cfb7b6cd6c3f114a3f2643ad1",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_legacyOwner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29",
+ "renamedFrom": "_owner"
+ },
+ {
+ "label": "_roles",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_mapping(t_bytes32,t_struct(RoleData)7648_storage)",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "_legacyVerifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "_legacyMultiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_legacyTrustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53",
+ "renamedFrom": "trustedSequencer"
+ },
+ {
+ "label": "_legacyBatchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57",
+ "renamedFrom": "batchFee"
+ },
+ {
+ "label": "_legacyForcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64",
+ "renamedFrom": "forcedBatches"
+ },
+ {
+ "label": "_legacySequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69",
+ "renamedFrom": "sequencedBatches"
+ },
+ {
+ "label": "_legacyLastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73",
+ "renamedFrom": "lastTimestamp"
+ },
+ {
+ "label": "_legacylastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77",
+ "renamedFrom": "lastBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81",
+ "renamedFrom": "lastForceBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85",
+ "renamedFrom": "lastForceBatch"
+ },
+ {
+ "label": "_legacyLastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89",
+ "renamedFrom": "lastVerifiedBatch"
+ },
+ {
+ "label": "_legacyTrustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93",
+ "renamedFrom": "trustedAggregator"
+ },
+ {
+ "label": "_legacyBatchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98",
+ "renamedFrom": "batchNumToStateRoot"
+ },
+ {
+ "label": "_legacyTrustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102",
+ "renamedFrom": "trustedSequencerURL"
+ },
+ {
+ "label": "_legacyNetworkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106",
+ "renamedFrom": "networkName"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7529_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111",
+ "renamedFrom": "pendingStateTransitions"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115",
+ "renamedFrom": "lastPendingState"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119",
+ "renamedFrom": "lastPendingStateConsolidated"
+ },
+ {
+ "label": "_legacyPendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "_legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "_legacyAdmin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132",
+ "renamedFrom": "admin"
+ },
+ {
+ "label": "_legacyPendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136",
+ "renamedFrom": "pendingAdmin"
+ },
+ {
+ "label": "_legacyForceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140",
+ "renamedFrom": "forceBatchTimeout"
+ },
+ {
+ "label": "_legacyIsForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144",
+ "renamedFrom": "isForcedBatchDisallowed"
+ },
+ {
+ "label": "_legacyVersion",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148",
+ "renamedFrom": "version"
+ },
+ {
+ "label": "_legacyLastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152",
+ "renamedFrom": "lastVerifiedBatchBeforeUpgrade"
+ },
+ {
+ "label": "rollupTypeCount",
+ "offset": 0,
+ "slot": "126",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:170"
+ },
+ {
+ "label": "rollupTypeMap",
+ "offset": 0,
+ "slot": "127",
+ "type": "t_mapping(t_uint32,t_struct(RollupType)3621_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:173"
+ },
+ {
+ "label": "rollupCount",
+ "offset": 0,
+ "slot": "128",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:176"
+ },
+ {
+ "label": "rollupIDToRollupData",
+ "offset": 0,
+ "slot": "129",
+ "type": "t_mapping(t_uint32,t_struct(RollupData)3663_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:179"
+ },
+ {
+ "label": "rollupAddressToID",
+ "offset": 0,
+ "slot": "130",
+ "type": "t_mapping(t_address,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:182"
+ },
+ {
+ "label": "chainIDToRollupID",
+ "offset": 0,
+ "slot": "131",
+ "type": "t_mapping(t_uint64,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:186"
+ },
+ {
+ "label": "totalSequencedBatches",
+ "offset": 0,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:189"
+ },
+ {
+ "label": "totalVerifiedBatches",
+ "offset": 8,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:192"
+ },
+ {
+ "label": "lastAggregationTimestamp",
+ "offset": 16,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:195"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:199"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 0,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:202"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 8,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:206"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 16,
+ "slot": "133",
+ "type": "t_uint16",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:209"
+ },
+ {
+ "label": "_batchFee",
+ "offset": 0,
+ "slot": "134",
+ "type": "t_uint256",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:213"
+ },
+ {
+ "label": "lastDeactivatedEmergencyStateTimestamp",
+ "offset": 0,
+ "slot": "135",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:216"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IPolygonRollupBase)7091": {
+ "label": "contract IPolygonRollupBase",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IVerifierRollup)3503": {
+ "label": "contract IVerifierRollup",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint32)": {
+ "label": "mapping(address => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(RoleData)7648_storage)": {
+ "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)7529_storage)": {
+ "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupData)3663_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupType)3621_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)": {
+ "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_uint32)": {
+ "label": "mapping(uint64 => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)7529_storage": {
+ "label": "struct LegacyZKEVMStateVariables.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(RoleData)7648_storage": {
+ "label": "struct PolygonAccessControlUpgradeable.RoleData",
+ "members": [
+ {
+ "label": "members",
+ "type": "t_mapping(t_address,t_bool)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "adminRole",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_struct(RollupData)3663_storage": {
+ "label": "struct PolygonRollupManager.RollupData",
+ "members": [
+ {
+ "label": "rollupContract",
+ "type": "t_contract(IPolygonRollupBase)7091",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "chainID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3503",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "sequencedBatches",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7529_storage)",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "lastLocalExitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingState",
+ "type": "t_uint64",
+ "offset": 16,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "type": "t_uint64",
+ "offset": 24,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "7"
+ },
+ {
+ "label": "rollupTypeID",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "7"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 16,
+ "slot": "7"
+ }
+ ],
+ "numberOfBytes": "256"
+ },
+ "t_struct(RollupType)3621_storage": {
+ "label": "struct PolygonRollupManager.RollupType",
+ "members": [
+ {
+ "label": "consensusImplementation",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3503",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 28,
+ "slot": "1"
+ },
+ {
+ "label": "obsolete",
+ "type": "t_bool",
+ "offset": 29,
+ "slot": "1"
+ },
+ {
+ "label": "genesis",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)7519_storage": {
+ "label": "struct LegacyZKEVMStateVariables.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ }
+ }
+}
diff --git a/upgrade/upgradeBanana/mainnnet-info/upgrade_output.json b/upgrade/upgradeBanana/mainnnet-info/upgrade_output.json
new file mode 100644
index 000000000..746f46d8a
--- /dev/null
+++ b/upgrade/upgradeBanana/mainnnet-info/upgrade_output.json
@@ -0,0 +1,35 @@
+{
+ "scheduleData": "0x8f2a0bb000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a49623609d000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000009bdda421219900454e94e01d641fe64c60d8f4c8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000103388f5661d224f4afb555c7e4a8fb52d0b752d00000000000000000000000000000000000000000000000000000000",
+ "executeData": "0xe38335e500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000a49623609d000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000009bdda421219900454e94e01d641fe64c60d8f4c8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004499a88ec40000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000103388f5661d224f4afb555c7e4a8fb52d0b752d00000000000000000000000000000000000000000000000000000000",
+ "timelockContractAdress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF",
+ "decodedScheduleData": {
+ "targets": [
+ "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A"
+ ],
+ "values": [
+ "0",
+ "0"
+ ],
+ "payloads": [
+ "0x9623609d000000000000000000000000580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb0000000000000000000000009bdda421219900454e94e01d641fe64c60d8f4c8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c00000000000000000000000000000000000000000000000000000000",
+ "0x99a88ec40000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000103388f5661d224f4afb555c7e4a8fb52d0b752d"
+ ],
+ "decodePayload_0": {
+ "signature": "upgradeAndCall(address,address,bytes)",
+ "selector": "0x9623609d",
+ "proxy": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb",
+ "implementation": "0x9Bdda421219900454E94e01d641fE64c60D8f4C8",
+ "data": "0x8129fc1c"
+ },
+ "decodePayload_1": {
+ "signature": "upgrade(address,address)",
+ "selector": "0x99a88ec4",
+ "proxy": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "implementation": "0x103388f5661d224F4aFb555C7E4a8FB52d0b752d"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/upgrade/upgradeBanana/upgradeBanana.ts b/upgrade/upgradeBanana/upgradeBanana.ts
new file mode 100644
index 000000000..7f2bfd3a6
--- /dev/null
+++ b/upgrade/upgradeBanana/upgradeBanana.ts
@@ -0,0 +1,253 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
+import {expect} from "chai";
+import path = require("path");
+import fs = require("fs");
+import {utils} from "ffjavascript";
+
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../.env")});
+import {ethers, upgrades} from "hardhat";
+import {PolygonRollupManager, PolygonZkEVM} from "../../typechain-types";
+
+const pathOutputJson = path.join(__dirname, "./upgrade_output.json");
+
+const upgradeParameters = require("./upgrade_parameters.json");
+
+async function main() {
+ upgrades.silenceWarnings();
+
+ /*
+ * Check upgrade parameters
+ * Check that every necessary parameter is fullfilled
+ */
+ const mandatoryUpgradeParameters = ["rollupManagerAddress", "timelockDelay"];
+
+ for (const parameterName of mandatoryUpgradeParameters) {
+ if (upgradeParameters[parameterName] === undefined || upgradeParameters[parameterName] === "") {
+ throw new Error(`Missing parameter: ${parameterName}`);
+ }
+ }
+ const {rollupManagerAddress, timelockDelay} = upgradeParameters;
+ const salt = upgradeParameters.timelockSalt || ethers.ZeroHash;
+
+ // Load onchain parameters
+ const polygonRMFactory = await ethers.getContractFactory("PolygonRollupManagerPrevious");
+ const polygonRMContract = (await polygonRMFactory.attach(rollupManagerAddress)) as PolygonRollupManager;
+
+ const globalExitRootManagerAddress = await polygonRMContract.globalExitRootManager();
+ const polAddress = await polygonRMContract.pol();
+ const bridgeAddress = await polygonRMContract.bridgeAddress();
+
+ // Load provider
+ let currentProvider = ethers.provider;
+ if (upgradeParameters.multiplierGas || upgradeParameters.maxFeePerGas) {
+ if (process.env.HARDHAT_NETWORK !== "hardhat") {
+ currentProvider = ethers.getDefaultProvider(
+ `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
+ ) as any;
+ if (upgradeParameters.maxPriorityFeePerGas && upgradeParameters.maxFeePerGas) {
+ console.log(
+ `Hardcoded gas used: MaxPriority${upgradeParameters.maxPriorityFeePerGas} gwei, MaxFee${upgradeParameters.maxFeePerGas} gwei`
+ );
+ const FEE_DATA = new ethers.FeeData(
+ null,
+ ethers.parseUnits(upgradeParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(upgradeParameters.maxPriorityFeePerGas, "gwei")
+ );
+
+ currentProvider.getFeeData = async () => FEE_DATA;
+ } else {
+ console.log("Multiplier gas used: ", upgradeParameters.multiplierGas);
+ async function overrideFeeData() {
+ const feedata = await ethers.provider.getFeeData();
+ return new ethers.FeeData(
+ null,
+ ((feedata.maxFeePerGas as bigint) * BigInt(upgradeParameters.multiplierGas)) / 1000n,
+ ((feedata.maxPriorityFeePerGas as bigint) * BigInt(upgradeParameters.multiplierGas)) / 1000n
+ );
+ }
+ currentProvider.getFeeData = overrideFeeData;
+ }
+ }
+ }
+
+ // Load deployer
+ let deployer;
+ if (upgradeParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(upgradeParameters.deployerPvtKey, currentProvider);
+ } else if (process.env.MNEMONIC) {
+ deployer = ethers.HDNodeWallet.fromMnemonic(
+ ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
+ "m/44'/60'/0'/0/0"
+ ).connect(currentProvider);
+ } else {
+ [deployer] = await ethers.getSigners();
+ }
+
+ console.log("deploying with: ", deployer.address);
+
+ const proxyAdmin = await upgrades.admin.getInstance();
+
+ // Assert correct admin
+ expect(await upgrades.erc1967.getAdminAddress(rollupManagerAddress as string)).to.be.equal(proxyAdmin.target);
+
+ const timelockAddress = await proxyAdmin.owner();
+
+ // load timelock
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+
+ // prapare upgrades
+
+ // prepare upgrade global exit root
+ // Prepare Upgrade PolygonZkEVMGlobalExitRootV2
+ const polygonGlobalExitRootV2 = await ethers.getContractFactory("PolygonZkEVMGlobalExitRootV2", deployer);
+
+ const newGlobalExitRoortImpl = await upgrades.prepareUpgrade(
+ globalExitRootManagerAddress,
+ polygonGlobalExitRootV2,
+ {
+ constructorArgs: [rollupManagerAddress, bridgeAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ }
+ );
+
+ console.log("#######################\n");
+ console.log(`polygonGlobalExitRootV2 impl: ${newGlobalExitRoortImpl}`);
+
+ console.log("you can verify the new impl address with:");
+ console.log(
+ `npx hardhat verify --constructor-args upgrade/arguments.js ${newGlobalExitRoortImpl} --network ${process.env.HARDHAT_NETWORK}\n`
+ );
+ console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
+ rollupManagerAddress,
+ bridgeAddress,
+ ]);
+
+ const operationGlobalExitRoot = genOperation(
+ proxyAdmin.target,
+ 0, // value,
+ proxyAdmin.interface.encodeFunctionData("upgradeAndCall", [
+ globalExitRootManagerAddress,
+ newGlobalExitRoortImpl,
+ polygonGlobalExitRootV2.interface.encodeFunctionData("initialize", []),
+ ]),
+ ethers.ZeroHash, // predecesoor
+ salt // salt
+ );
+
+ // Upgrade to rollup manager
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+ const implRollupManager = await upgrades.prepareUpgrade(rollupManagerAddress, PolygonRollupManagerFactory, {
+ constructorArgs: [globalExitRootManagerAddress, polAddress, bridgeAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable"],
+ });
+
+ console.log("#######################\n");
+ console.log(`Polygon rollup manager: ${implRollupManager}`);
+
+ console.log("you can verify the new impl address with:");
+ console.log(
+ `npx hardhat verify --constructor-args upgrade/arguments.js ${implRollupManager} --network ${process.env.HARDHAT_NETWORK}\n`
+ );
+ console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
+ globalExitRootManagerAddress,
+ polAddress,
+ bridgeAddress,
+ ]);
+
+ const operationRollupManager = genOperation(
+ proxyAdmin.target,
+ 0, // value
+ proxyAdmin.interface.encodeFunctionData("upgrade", [rollupManagerAddress, implRollupManager]),
+ ethers.ZeroHash, // predecesoor
+ salt // salt
+ );
+
+ // Schedule operation
+ const scheduleData = timelockContractFactory.interface.encodeFunctionData("scheduleBatch", [
+ [operationGlobalExitRoot.target, operationRollupManager.target],
+ [operationGlobalExitRoot.value, operationRollupManager.value],
+ [operationGlobalExitRoot.data, operationRollupManager.data],
+ ethers.ZeroHash, // predecesoor
+ salt, // salt
+ timelockDelay,
+ ]);
+
+ // Execute operation
+ const executeData = timelockContractFactory.interface.encodeFunctionData("executeBatch", [
+ [operationGlobalExitRoot.target, operationRollupManager.target],
+ [operationGlobalExitRoot.value, operationRollupManager.value],
+ [operationGlobalExitRoot.data, operationRollupManager.data],
+ ethers.ZeroHash, // predecesoor
+ salt, // salt
+ ]);
+
+ console.log({scheduleData});
+ console.log({executeData});
+
+ const outputJson = {
+ scheduleData,
+ executeData,
+ timelockContractAdress: timelockAddress,
+ };
+
+ // Decode the scheduleData for better readibility
+ const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
+ const paramsArray = timelockTx?.fragment.inputs;
+ const objectDecoded = {};
+
+ for (let i = 0; i < paramsArray?.length; i++) {
+ const currentParam = paramsArray[i];
+ objectDecoded[currentParam.name] = timelockTx?.args[i];
+
+ if (currentParam.name == "payloads") {
+ // for each payload
+ const payloads = timelockTx?.args[i];
+ for (let j = 0; j < payloads.length; j++) {
+ const data = payloads[j];
+ const decodedProxyAdmin = proxyAdmin.interface.parseTransaction({
+ data,
+ });
+
+ const resultDecodeProxyAdmin = {};
+ resultDecodeProxyAdmin.signature = decodedProxyAdmin?.signature;
+ resultDecodeProxyAdmin.selector = decodedProxyAdmin?.selector;
+
+ const paramsArrayData = decodedProxyAdmin?.fragment.inputs;
+
+ for (let n = 0; n < paramsArrayData?.length; n++) {
+ const currentParam = paramsArrayData[n];
+ resultDecodeProxyAdmin[currentParam.name] = decodedProxyAdmin?.args[n];
+ }
+ objectDecoded[`decodePayload_${j}`] = resultDecodeProxyAdmin;
+ }
+ }
+ }
+
+ outputJson.decodedScheduleData = objectDecoded;
+
+ fs.writeFileSync(pathOutputJson, JSON.stringify(utils.stringifyBigInts(outputJson), null, 1));
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
+
+// OZ test functions
+function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) {
+ const abiEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["address", "uint256", "bytes", "uint256", "bytes32"],
+ [target, value, data, predecessor, salt]
+ );
+ const id = ethers.keccak256(abiEncoded);
+ return {
+ id,
+ target,
+ value,
+ data,
+ predecessor,
+ salt,
+ };
+}
diff --git a/upgrade/upgradeBanana/upgrade_parameters.json.example b/upgrade/upgradeBanana/upgrade_parameters.json.example
new file mode 100644
index 000000000..ba1e2fb60
--- /dev/null
+++ b/upgrade/upgradeBanana/upgrade_parameters.json.example
@@ -0,0 +1,9 @@
+{
+ "rollupManagerAddress": "0x00..",
+ "timelockDelay": 0,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas": "",
+ "maxPriorityFeePerGas": "",
+ "multiplierGas": ""
+}
diff --git a/upgrade/upgradePessimistic/mainnet-info/mainnet.json b/upgrade/upgradePessimistic/mainnet-info/mainnet.json
new file mode 100644
index 000000000..b67ebe2e6
--- /dev/null
+++ b/upgrade/upgradePessimistic/mainnet-info/mainnet.json
@@ -0,0 +1,4106 @@
+{
+ "manifestVersion": "3.2",
+ "admin": {
+ "address": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A"
+ },
+ "proxies": [
+ {
+ "address": "0x2a3DD3EB832aF982ec71669E178424b10Dca2EDe",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x580bda1e7A0CFAe92Fa7F6c20A3794F169CE3CFb",
+ "txHash": "0x9946be78d6c6d19dd1c6c7134a8fac27e76d32cad36dae2398d28fe6ff838f10",
+ "kind": "transparent"
+ },
+ {
+ "address": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "txHash": "0xe34243804e1f7257acb09c97d0d6f023663200c39ee85a1e6927b0b391710bbb",
+ "kind": "transparent"
+ }
+ ],
+ "impls": {
+ "7d81d3d49439b439759dc4a136c30bff477402e06213014f3132a9b83751e779": {
+ "address": "0x5ac4182A1dd41AeEf465E40B82fd326BF66AB82C",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "_status",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_uint256",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:25"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "83",
+ "type": "t_uint256",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:28"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "84",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContract",
+ "src": "contracts/lib/DepositContract.sol:34"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "94",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "networkID",
+ "offset": 1,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:51"
+ },
+ {
+ "label": "globalExitRootManager",
+ "offset": 5,
+ "slot": "104",
+ "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:54"
+ },
+ {
+ "label": "lastUpdatedDepositCount",
+ "offset": 25,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:57"
+ },
+ {
+ "label": "claimedBitMap",
+ "offset": 0,
+ "slot": "105",
+ "type": "t_mapping(t_uint256,t_uint256)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:60"
+ },
+ {
+ "label": "tokenInfoToWrappedToken",
+ "offset": 0,
+ "slot": "106",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:63"
+ },
+ {
+ "label": "wrappedTokenToTokenInfo",
+ "offset": 0,
+ "slot": "107",
+ "type": "t_mapping(t_address,t_struct(TokenInformation)8241_storage)",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:66"
+ },
+ {
+ "label": "polygonZkEVMaddress",
+ "offset": 0,
+ "slot": "108",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridge",
+ "src": "contracts/PolygonZkEVMBridge.sol:69"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IBasePolygonZkEVMGlobalExitRoot)10065": {
+ "label": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(TokenInformation)8241_storage)": {
+ "label": "mapping(address => struct PolygonZkEVMBridge.TokenInformation)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_uint256)": {
+ "label": "mapping(uint256 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(TokenInformation)8241_storage": {
+ "label": "struct PolygonZkEVMBridge.TokenInformation",
+ "members": [
+ {
+ "label": "originNetwork",
+ "type": "t_uint32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "originTokenAddress",
+ "type": "t_address",
+ "offset": 4,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "ce5f0c71bed14342c9985301ac01d3f106aecc5e1faee3ca7b5845eede57422f": {
+ "address": "0xbc1ea504fC54D078514eFCCA1F6860B5219B6BC3",
+ "txHash": "0x56b5e9a0955c816edefa8ab4cc057b7a41ef97c472c9027049c9353a01a8bea4",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:19"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:22"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRoot",
+ "src": "contracts/PolygonZkEVMGlobalExitRoot.sol:25"
+ }
+ ],
+ "types": {
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ }
+ }
+ },
+ "4c7ed8ca43394b0ba1dd706ad28512fc2a3a8db4899762861bf5582c75c8b607": {
+ "address": "0xe262Ea2782e2e8dbFe354048c3B5d6DE9603EfEF",
+ "txHash": "0xc93e7884d6c7f6bf332cf154977f58840b1b0e82be46b2ee3ec04fd979e9a2bc",
+ "layout": {
+ "solcVersion": "0.8.17",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5689_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5689_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5680_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5689_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5680_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "e0de5cb0e66c4e74b3f8f18ec5f07b6d781194a34a618b25f6325b5fe1ebfba3": {
+ "address": "0x301442aA888701c8B86727d42F3C55Fb0dd9eF7F",
+ "txHash": "0xeb9e883290a29cd74f2c8097b1f85b6b95d52733a9b6361b6c9f59a5513e0ec7",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ },
+ {
+ "label": "version",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5693_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5683_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ }
+ }
+ },
+ "5cd0db59b0eeb57c4ea1d368b5b6558e055166c8d2d5b6a32c78020af986fb5e": {
+ "address": "0xb1585916487AcEdD99952086f2950763D253b923",
+ "txHash": "0x1e28f164ca48acc0766d1ef801f2852804a24704cda619ab762254ac22957612",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_owner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:22"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "OwnableUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:94"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:167"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:170"
+ },
+ {
+ "label": "trustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:173"
+ },
+ {
+ "label": "batchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:176"
+ },
+ {
+ "label": "forcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:182"
+ },
+ {
+ "label": "sequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:186"
+ },
+ {
+ "label": "lastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:189"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:192"
+ },
+ {
+ "label": "lastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:195"
+ },
+ {
+ "label": "lastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:198"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:201"
+ },
+ {
+ "label": "trustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:204"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:208"
+ },
+ {
+ "label": "trustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:211"
+ },
+ {
+ "label": "networkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:214"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)5693_storage)",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:218"
+ },
+ {
+ "label": "lastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:221"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:224"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:227"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:231"
+ },
+ {
+ "label": "admin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:234"
+ },
+ {
+ "label": "pendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:237"
+ },
+ {
+ "label": "forceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:240"
+ },
+ {
+ "label": "isForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "PolygonZkEVM",
+ "src": "contracts/PolygonZkEVM.sol:243"
+ },
+ {
+ "label": "version",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:15"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "PolygonZkEVMUpgraded",
+ "src": "contracts/mainnetUpgraded/PolygonZkEVMUpgraded.sol:18"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)5693_storage)": {
+ "label": "mapping(uint256 => struct PolygonZkEVM.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)5683_storage)": {
+ "label": "mapping(uint64 => struct PolygonZkEVM.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)5693_storage": {
+ "label": "struct PolygonZkEVM.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)5683_storage": {
+ "label": "struct PolygonZkEVM.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "79801cf42fb30168bed48ec167efe6a64d9c46e15685898f72431bb91455bb0a": {
+ "address": "0x0FeB850B183C57534b56b7d56520133C8f9BDB65",
+ "txHash": "0x4b0fb5c86ce3a7ba42a2ad487f838c50c1dd3102b9009d8d1b3dbc1d0ccbf98a",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "_status",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_uint256",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_array(t_uint256)49_storage",
+ "contract": "ReentrancyGuardUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:80"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "83",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "84",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "94",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "104",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "networkID",
+ "offset": 1,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:61"
+ },
+ {
+ "label": "globalExitRootManager",
+ "offset": 5,
+ "slot": "104",
+ "type": "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:64"
+ },
+ {
+ "label": "lastUpdatedDepositCount",
+ "offset": 25,
+ "slot": "104",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:67"
+ },
+ {
+ "label": "claimedBitMap",
+ "offset": 0,
+ "slot": "105",
+ "type": "t_mapping(t_uint256,t_uint256)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:70"
+ },
+ {
+ "label": "tokenInfoToWrappedToken",
+ "offset": 0,
+ "slot": "106",
+ "type": "t_mapping(t_bytes32,t_address)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:73"
+ },
+ {
+ "label": "wrappedTokenToTokenInfo",
+ "offset": 0,
+ "slot": "107",
+ "type": "t_mapping(t_address,t_struct(TokenInformation)2064_storage)",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:76"
+ },
+ {
+ "label": "polygonRollupManager",
+ "offset": 0,
+ "slot": "108",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:80",
+ "renamedFrom": "polygonZkEVMaddress"
+ },
+ {
+ "label": "gasTokenAddress",
+ "offset": 0,
+ "slot": "109",
+ "type": "t_address",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:83"
+ },
+ {
+ "label": "gasTokenNetwork",
+ "offset": 20,
+ "slot": "109",
+ "type": "t_uint32",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:86"
+ },
+ {
+ "label": "gasTokenMetadata",
+ "offset": 0,
+ "slot": "110",
+ "type": "t_bytes_storage",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:89"
+ },
+ {
+ "label": "WETHToken",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_contract(TokenWrapped)2037",
+ "contract": "PolygonZkEVMBridgeV2",
+ "src": "contracts/v2/PolygonZkEVMBridgeV2.sol:92"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)49_storage": {
+ "label": "uint256[49]",
+ "numberOfBytes": "1568"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_bytes_storage": {
+ "label": "bytes",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IBasePolygonZkEVMGlobalExitRoot)1675": {
+ "label": "contract IBasePolygonZkEVMGlobalExitRoot",
+ "numberOfBytes": "20"
+ },
+ "t_contract(TokenWrapped)2037": {
+ "label": "contract TokenWrapped",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_struct(TokenInformation)2064_storage)": {
+ "label": "mapping(address => struct PolygonZkEVMBridgeV2.TokenInformation)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_address)": {
+ "label": "mapping(bytes32 => address)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_uint256)": {
+ "label": "mapping(uint256 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_struct(TokenInformation)2064_storage": {
+ "label": "struct PolygonZkEVMBridgeV2.TokenInformation",
+ "members": [
+ {
+ "label": "originNetwork",
+ "type": "t_uint32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "originTokenAddress",
+ "type": "t_address",
+ "offset": 4,
+ "slot": "0"
+ }
+ ],
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "0276720dd07b80a08f307a7d10b2a30c8973b8dad1bb0fef986ed1e3b6a2a9c4": {
+ "address": "0x2E38cD55163137483E30580Cb468C2dFf1d85077",
+ "txHash": "0xe15832f3a7bac8245a57bf658f49b60fb06e91b6c60645ac1489c5e04a76decf",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:14"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:17"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:21"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "35",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "36",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ }
+ ],
+ "types": {
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "55d2f394d0399c9e6e9a2e9773726fe47025d9e46193ddce8361a97fc7a550a6": {
+ "address": "0x3b82Da772c825283d85d5d6717A77C6Ff582053b",
+ "txHash": "0x19d27fa6f277e99c64a02af1a3d7532c24cabe58505f334ab98f8a5b7ac5d565",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_legacyOwner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29",
+ "renamedFrom": "_owner"
+ },
+ {
+ "label": "_roles",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "_legacyVerifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "_legacyMultiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_legacyTrustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53",
+ "renamedFrom": "trustedSequencer"
+ },
+ {
+ "label": "_legacyBatchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57",
+ "renamedFrom": "batchFee"
+ },
+ {
+ "label": "_legacyForcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64",
+ "renamedFrom": "forcedBatches"
+ },
+ {
+ "label": "_legacySequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69",
+ "renamedFrom": "sequencedBatches"
+ },
+ {
+ "label": "_legacyLastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73",
+ "renamedFrom": "lastTimestamp"
+ },
+ {
+ "label": "_legacylastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77",
+ "renamedFrom": "lastBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81",
+ "renamedFrom": "lastForceBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85",
+ "renamedFrom": "lastForceBatch"
+ },
+ {
+ "label": "_legacyLastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89",
+ "renamedFrom": "lastVerifiedBatch"
+ },
+ {
+ "label": "_legacyTrustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93",
+ "renamedFrom": "trustedAggregator"
+ },
+ {
+ "label": "_legacyBatchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98",
+ "renamedFrom": "batchNumToStateRoot"
+ },
+ {
+ "label": "_legacyTrustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102",
+ "renamedFrom": "trustedSequencerURL"
+ },
+ {
+ "label": "_legacyNetworkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106",
+ "renamedFrom": "networkName"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111",
+ "renamedFrom": "pendingStateTransitions"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115",
+ "renamedFrom": "lastPendingState"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119",
+ "renamedFrom": "lastPendingStateConsolidated"
+ },
+ {
+ "label": "_legacyPendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "_legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "_legacyAdmin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132",
+ "renamedFrom": "admin"
+ },
+ {
+ "label": "_legacyPendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136",
+ "renamedFrom": "pendingAdmin"
+ },
+ {
+ "label": "_legacyForceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140",
+ "renamedFrom": "forceBatchTimeout"
+ },
+ {
+ "label": "_legacyIsForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144",
+ "renamedFrom": "isForcedBatchDisallowed"
+ },
+ {
+ "label": "_legacyVersion",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148",
+ "renamedFrom": "version"
+ },
+ {
+ "label": "_legacyLastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152",
+ "renamedFrom": "lastVerifiedBatchBeforeUpgrade"
+ },
+ {
+ "label": "rollupTypeCount",
+ "offset": 0,
+ "slot": "126",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:170"
+ },
+ {
+ "label": "rollupTypeMap",
+ "offset": 0,
+ "slot": "127",
+ "type": "t_mapping(t_uint32,t_struct(RollupType)3613_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:173"
+ },
+ {
+ "label": "rollupCount",
+ "offset": 0,
+ "slot": "128",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:176"
+ },
+ {
+ "label": "rollupIDToRollupData",
+ "offset": 0,
+ "slot": "129",
+ "type": "t_mapping(t_uint32,t_struct(RollupData)3655_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:179"
+ },
+ {
+ "label": "rollupAddressToID",
+ "offset": 0,
+ "slot": "130",
+ "type": "t_mapping(t_address,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:182"
+ },
+ {
+ "label": "chainIDToRollupID",
+ "offset": 0,
+ "slot": "131",
+ "type": "t_mapping(t_uint64,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:186"
+ },
+ {
+ "label": "totalSequencedBatches",
+ "offset": 0,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:189"
+ },
+ {
+ "label": "totalVerifiedBatches",
+ "offset": 8,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:192"
+ },
+ {
+ "label": "lastAggregationTimestamp",
+ "offset": 16,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:195"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:199"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 0,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:202"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 8,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:206"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 16,
+ "slot": "133",
+ "type": "t_uint16",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:209"
+ },
+ {
+ "label": "_batchFee",
+ "offset": 0,
+ "slot": "134",
+ "type": "t_uint256",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:213"
+ },
+ {
+ "label": "lastDeactivatedEmergencyStateTimestamp",
+ "offset": 0,
+ "slot": "135",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:216"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IPolygonRollupBase)6982": {
+ "label": "contract IPolygonRollupBase",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IVerifierRollup)3495": {
+ "label": "contract IVerifierRollup",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint32)": {
+ "label": "mapping(address => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(RoleData)7463_storage)": {
+ "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)7344_storage)": {
+ "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupData)3655_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupType)3613_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)": {
+ "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_uint32)": {
+ "label": "mapping(uint64 => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)7344_storage": {
+ "label": "struct LegacyZKEVMStateVariables.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(RoleData)7463_storage": {
+ "label": "struct PolygonAccessControlUpgradeable.RoleData",
+ "members": [
+ {
+ "label": "members",
+ "type": "t_mapping(t_address,t_bool)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "adminRole",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_struct(RollupData)3655_storage": {
+ "label": "struct PolygonRollupManager.RollupData",
+ "members": [
+ {
+ "label": "rollupContract",
+ "type": "t_contract(IPolygonRollupBase)6982",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "chainID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3495",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "sequencedBatches",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7334_storage)",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7344_storage)",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "lastLocalExitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingState",
+ "type": "t_uint64",
+ "offset": 16,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "type": "t_uint64",
+ "offset": 24,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "7"
+ },
+ {
+ "label": "rollupTypeID",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "7"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 16,
+ "slot": "7"
+ }
+ ],
+ "numberOfBytes": "256"
+ },
+ "t_struct(RollupType)3613_storage": {
+ "label": "struct PolygonRollupManager.RollupType",
+ "members": [
+ {
+ "label": "consensusImplementation",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3495",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 28,
+ "slot": "1"
+ },
+ {
+ "label": "obsolete",
+ "type": "t_bool",
+ "offset": 29,
+ "slot": "1"
+ },
+ {
+ "label": "genesis",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)7334_storage": {
+ "label": "struct LegacyZKEVMStateVariables.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "a3d4b058e74fe980dbf467091a7b6a272bb85c59e68bdcdacefe9389c98e3059": {
+ "address": "0x9Bdda421219900454E94e01d641fE64c60D8f4C8",
+ "txHash": "0x50dacd70e51e240a3996b61cc054934bdcbd896c426c1a9fcfe41e60f0685848",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "lastRollupExitRoot",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:14"
+ },
+ {
+ "label": "lastMainnetExitRoot",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_bytes32",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:17"
+ },
+ {
+ "label": "globalExitRootMap",
+ "offset": 0,
+ "slot": "2",
+ "type": "t_mapping(t_bytes32,t_uint256)",
+ "contract": "PolygonZkEVMGlobalExitRootBaseStorage",
+ "src": "contracts/v2/lib/PolygonZkEVMGlobalExitRootBaseStorage.sol:21"
+ },
+ {
+ "label": "_branch",
+ "offset": 0,
+ "slot": "3",
+ "type": "t_array(t_bytes32)32_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:23"
+ },
+ {
+ "label": "depositCount",
+ "offset": 0,
+ "slot": "35",
+ "type": "t_uint256",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:26"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "36",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "DepositContractBase",
+ "src": "contracts/v2/lib/DepositContractBase.sol:32"
+ },
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "46",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "46",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "l1InfoRootMap",
+ "offset": 0,
+ "slot": "47",
+ "type": "t_mapping(t_uint32,t_bytes32)",
+ "contract": "PolygonZkEVMGlobalExitRootV2",
+ "src": "contracts/v2/PolygonZkEVMGlobalExitRootV2.sol:26"
+ }
+ ],
+ "types": {
+ "t_array(t_bytes32)32_storage": {
+ "label": "bytes32[32]",
+ "numberOfBytes": "1024"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_uint256)": {
+ "label": "mapping(bytes32 => uint256)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_bytes32)": {
+ "label": "mapping(uint32 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "e81dad715669290426e2ace87376be8949fd6f394237dc4ac4dedaf1cb234ee1": {
+ "address": "0x103388f5661d224F4aFb555C7E4a8FB52d0b752d",
+ "txHash": "0x5035aa7da7f57c8e83b1510d5a88ba511cf5a74cfb7b6cd6c3f114a3f2643ad1",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_legacyOwner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29",
+ "renamedFrom": "_owner"
+ },
+ {
+ "label": "_roles",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_mapping(t_bytes32,t_struct(RoleData)7648_storage)",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "_legacyVerifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "_legacyMultiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_legacyTrustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53",
+ "renamedFrom": "trustedSequencer"
+ },
+ {
+ "label": "_legacyBatchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57",
+ "renamedFrom": "batchFee"
+ },
+ {
+ "label": "_legacyForcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64",
+ "renamedFrom": "forcedBatches"
+ },
+ {
+ "label": "_legacySequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69",
+ "renamedFrom": "sequencedBatches"
+ },
+ {
+ "label": "_legacyLastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73",
+ "renamedFrom": "lastTimestamp"
+ },
+ {
+ "label": "_legacylastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77",
+ "renamedFrom": "lastBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81",
+ "renamedFrom": "lastForceBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85",
+ "renamedFrom": "lastForceBatch"
+ },
+ {
+ "label": "_legacyLastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89",
+ "renamedFrom": "lastVerifiedBatch"
+ },
+ {
+ "label": "_legacyTrustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93",
+ "renamedFrom": "trustedAggregator"
+ },
+ {
+ "label": "_legacyBatchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98",
+ "renamedFrom": "batchNumToStateRoot"
+ },
+ {
+ "label": "_legacyTrustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102",
+ "renamedFrom": "trustedSequencerURL"
+ },
+ {
+ "label": "_legacyNetworkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106",
+ "renamedFrom": "networkName"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7529_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111",
+ "renamedFrom": "pendingStateTransitions"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115",
+ "renamedFrom": "lastPendingState"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119",
+ "renamedFrom": "lastPendingStateConsolidated"
+ },
+ {
+ "label": "_legacyPendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "_legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "_legacyAdmin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132",
+ "renamedFrom": "admin"
+ },
+ {
+ "label": "_legacyPendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136",
+ "renamedFrom": "pendingAdmin"
+ },
+ {
+ "label": "_legacyForceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140",
+ "renamedFrom": "forceBatchTimeout"
+ },
+ {
+ "label": "_legacyIsForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144",
+ "renamedFrom": "isForcedBatchDisallowed"
+ },
+ {
+ "label": "_legacyVersion",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148",
+ "renamedFrom": "version"
+ },
+ {
+ "label": "_legacyLastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152",
+ "renamedFrom": "lastVerifiedBatchBeforeUpgrade"
+ },
+ {
+ "label": "rollupTypeCount",
+ "offset": 0,
+ "slot": "126",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:170"
+ },
+ {
+ "label": "rollupTypeMap",
+ "offset": 0,
+ "slot": "127",
+ "type": "t_mapping(t_uint32,t_struct(RollupType)3621_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:173"
+ },
+ {
+ "label": "rollupCount",
+ "offset": 0,
+ "slot": "128",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:176"
+ },
+ {
+ "label": "rollupIDToRollupData",
+ "offset": 0,
+ "slot": "129",
+ "type": "t_mapping(t_uint32,t_struct(RollupData)3663_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:179"
+ },
+ {
+ "label": "rollupAddressToID",
+ "offset": 0,
+ "slot": "130",
+ "type": "t_mapping(t_address,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:182"
+ },
+ {
+ "label": "chainIDToRollupID",
+ "offset": 0,
+ "slot": "131",
+ "type": "t_mapping(t_uint64,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:186"
+ },
+ {
+ "label": "totalSequencedBatches",
+ "offset": 0,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:189"
+ },
+ {
+ "label": "totalVerifiedBatches",
+ "offset": 8,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:192"
+ },
+ {
+ "label": "lastAggregationTimestamp",
+ "offset": 16,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:195"
+ },
+ {
+ "label": "trustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:199"
+ },
+ {
+ "label": "pendingStateTimeout",
+ "offset": 0,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:202"
+ },
+ {
+ "label": "verifyBatchTimeTarget",
+ "offset": 8,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:206"
+ },
+ {
+ "label": "multiplierBatchFee",
+ "offset": 16,
+ "slot": "133",
+ "type": "t_uint16",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:209"
+ },
+ {
+ "label": "_batchFee",
+ "offset": 0,
+ "slot": "134",
+ "type": "t_uint256",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:213"
+ },
+ {
+ "label": "lastDeactivatedEmergencyStateTimestamp",
+ "offset": 0,
+ "slot": "135",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:216"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IPolygonRollupBase)7091": {
+ "label": "contract IPolygonRollupBase",
+ "numberOfBytes": "20"
+ },
+ "t_contract(IVerifierRollup)3503": {
+ "label": "contract IVerifierRollup",
+ "numberOfBytes": "20"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint32)": {
+ "label": "mapping(address => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(RoleData)7648_storage)": {
+ "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)7529_storage)": {
+ "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupData)3663_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupType)3621_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)": {
+ "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_uint32)": {
+ "label": "mapping(uint64 => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)7529_storage": {
+ "label": "struct LegacyZKEVMStateVariables.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(RoleData)7648_storage": {
+ "label": "struct PolygonAccessControlUpgradeable.RoleData",
+ "members": [
+ {
+ "label": "members",
+ "type": "t_mapping(t_address,t_bool)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "adminRole",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_struct(RollupData)3663_storage": {
+ "label": "struct PolygonRollupManager.RollupData",
+ "members": [
+ {
+ "label": "rollupContract",
+ "type": "t_contract(IPolygonRollupBase)7091",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "chainID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3503",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "sequencedBatches",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7519_storage)",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "pendingStateTransitions",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7529_storage)",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "lastLocalExitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingState",
+ "type": "t_uint64",
+ "offset": 16,
+ "slot": "6"
+ },
+ {
+ "label": "lastPendingStateConsolidated",
+ "type": "t_uint64",
+ "offset": 24,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "7"
+ },
+ {
+ "label": "rollupTypeID",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "7"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 16,
+ "slot": "7"
+ }
+ ],
+ "numberOfBytes": "256"
+ },
+ "t_struct(RollupType)3621_storage": {
+ "label": "struct PolygonRollupManager.RollupType",
+ "members": [
+ {
+ "label": "consensusImplementation",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_contract(IVerifierRollup)3503",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "rollupCompatibilityID",
+ "type": "t_uint8",
+ "offset": 28,
+ "slot": "1"
+ },
+ {
+ "label": "obsolete",
+ "type": "t_bool",
+ "offset": 29,
+ "slot": "1"
+ },
+ {
+ "label": "genesis",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(SequencedBatchData)7519_storage": {
+ "label": "struct LegacyZKEVMStateVariables.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ },
+ "a450e577c140682dc145643c778d87fdc12555158db14a7a92ef84024655bb44": {
+ "address": "0xA33619940bceb9be7c9679Dd80FA2918C2476382",
+ "txHash": "0xb779797cb34a0557f251f1bbd65fe9ab0b2e33bfa016a629125e235c5e822a73",
+ "layout": {
+ "solcVersion": "0.8.20",
+ "storage": [
+ {
+ "label": "_initialized",
+ "offset": 0,
+ "slot": "0",
+ "type": "t_uint8",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62",
+ "retypedFrom": "bool"
+ },
+ {
+ "label": "_initializing",
+ "offset": 1,
+ "slot": "0",
+ "type": "t_bool",
+ "contract": "Initializable",
+ "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "1",
+ "type": "t_array(t_uint256)50_storage",
+ "contract": "ContextUpgradeable",
+ "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36"
+ },
+ {
+ "label": "_legacyOwner",
+ "offset": 0,
+ "slot": "51",
+ "type": "t_address",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:29",
+ "renamedFrom": "_owner"
+ },
+ {
+ "label": "_roles",
+ "offset": 0,
+ "slot": "52",
+ "type": "t_mapping(t_bytes32,t_struct(RoleData)7254_storage)",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:36"
+ },
+ {
+ "label": "__gap",
+ "offset": 0,
+ "slot": "53",
+ "type": "t_array(t_uint256)48_storage",
+ "contract": "PolygonAccessControlUpgradeable",
+ "src": "contracts/v2/lib/PolygonAccessControlUpgradeable.sol:244"
+ },
+ {
+ "label": "_gap",
+ "offset": 0,
+ "slot": "101",
+ "type": "t_array(t_uint256)10_storage",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:23"
+ },
+ {
+ "label": "isEmergencyState",
+ "offset": 0,
+ "slot": "111",
+ "type": "t_bool",
+ "contract": "EmergencyManager",
+ "src": "contracts/lib/EmergencyManager.sol:26"
+ },
+ {
+ "label": "_legacyVerifyBatchTimeTarget",
+ "offset": 1,
+ "slot": "111",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:45",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "_legacyMultiplierBatchFee",
+ "offset": 9,
+ "slot": "111",
+ "type": "t_uint16",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:49",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_legacyTrustedSequencer",
+ "offset": 11,
+ "slot": "111",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:53",
+ "renamedFrom": "trustedSequencer"
+ },
+ {
+ "label": "_legacyBatchFee",
+ "offset": 0,
+ "slot": "112",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:57",
+ "renamedFrom": "batchFee"
+ },
+ {
+ "label": "_legacyForcedBatches",
+ "offset": 0,
+ "slot": "113",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:64",
+ "renamedFrom": "forcedBatches"
+ },
+ {
+ "label": "_legacySequencedBatches",
+ "offset": 0,
+ "slot": "114",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7125_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:69",
+ "renamedFrom": "sequencedBatches"
+ },
+ {
+ "label": "_legacyLastTimestamp",
+ "offset": 0,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:73",
+ "renamedFrom": "lastTimestamp"
+ },
+ {
+ "label": "_legacylastBatchSequenced",
+ "offset": 8,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:77",
+ "renamedFrom": "lastBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatchSequenced",
+ "offset": 16,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:81",
+ "renamedFrom": "lastForceBatchSequenced"
+ },
+ {
+ "label": "_legacyLastForceBatch",
+ "offset": 24,
+ "slot": "115",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:85",
+ "renamedFrom": "lastForceBatch"
+ },
+ {
+ "label": "_legacyLastVerifiedBatch",
+ "offset": 0,
+ "slot": "116",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:89",
+ "renamedFrom": "lastVerifiedBatch"
+ },
+ {
+ "label": "_legacyTrustedAggregator",
+ "offset": 8,
+ "slot": "116",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:93",
+ "renamedFrom": "trustedAggregator"
+ },
+ {
+ "label": "_legacyBatchNumToStateRoot",
+ "offset": 0,
+ "slot": "117",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:98",
+ "renamedFrom": "batchNumToStateRoot"
+ },
+ {
+ "label": "_legacyTrustedSequencerURL",
+ "offset": 0,
+ "slot": "118",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:102",
+ "renamedFrom": "trustedSequencerURL"
+ },
+ {
+ "label": "_legacyNetworkName",
+ "offset": 0,
+ "slot": "119",
+ "type": "t_string_storage",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:106",
+ "renamedFrom": "networkName"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "offset": 0,
+ "slot": "120",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7135_storage)",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:111",
+ "renamedFrom": "pendingStateTransitions"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "offset": 0,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:115",
+ "renamedFrom": "lastPendingState"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "offset": 8,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:119",
+ "renamedFrom": "lastPendingStateConsolidated"
+ },
+ {
+ "label": "_legacyPendingStateTimeout",
+ "offset": 16,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:123",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "_legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "121",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:128",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "_legacyAdmin",
+ "offset": 0,
+ "slot": "122",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:132",
+ "renamedFrom": "admin"
+ },
+ {
+ "label": "_legacyPendingAdmin",
+ "offset": 0,
+ "slot": "123",
+ "type": "t_address",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:136",
+ "renamedFrom": "pendingAdmin"
+ },
+ {
+ "label": "_legacyForceBatchTimeout",
+ "offset": 20,
+ "slot": "123",
+ "type": "t_uint64",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:140",
+ "renamedFrom": "forceBatchTimeout"
+ },
+ {
+ "label": "_legacyIsForcedBatchDisallowed",
+ "offset": 28,
+ "slot": "123",
+ "type": "t_bool",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:144",
+ "renamedFrom": "isForcedBatchDisallowed"
+ },
+ {
+ "label": "_legacyVersion",
+ "offset": 0,
+ "slot": "124",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:148",
+ "renamedFrom": "version"
+ },
+ {
+ "label": "_legacyLastVerifiedBatchBeforeUpgrade",
+ "offset": 0,
+ "slot": "125",
+ "type": "t_uint256",
+ "contract": "LegacyZKEVMStateVariables",
+ "src": "contracts/v2/lib/LegacyZKEVMStateVariables.sol:152",
+ "renamedFrom": "lastVerifiedBatchBeforeUpgrade"
+ },
+ {
+ "label": "rollupTypeCount",
+ "offset": 0,
+ "slot": "126",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:247"
+ },
+ {
+ "label": "rollupTypeMap",
+ "offset": 0,
+ "slot": "127",
+ "type": "t_mapping(t_uint32,t_struct(RollupType)3633_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:251",
+ "retypedFrom": "PolygonRollupManagerPrevious.RollupType"
+ },
+ {
+ "label": "rollupCount",
+ "offset": 0,
+ "slot": "128",
+ "type": "t_uint32",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:254"
+ },
+ {
+ "label": "_rollupIDToRollupData",
+ "offset": 0,
+ "slot": "129",
+ "type": "t_mapping(t_uint32,t_struct(RollupData)3683_storage)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:258",
+ "retypedFrom": "PolygonRollupManagerPrevious.RollupData"
+ },
+ {
+ "label": "rollupAddressToID",
+ "offset": 0,
+ "slot": "130",
+ "type": "t_mapping(t_address,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:261"
+ },
+ {
+ "label": "chainIDToRollupID",
+ "offset": 0,
+ "slot": "131",
+ "type": "t_mapping(t_uint64,t_uint32)",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:265"
+ },
+ {
+ "label": "totalSequencedBatches",
+ "offset": 0,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:268"
+ },
+ {
+ "label": "totalVerifiedBatches",
+ "offset": 8,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:271"
+ },
+ {
+ "label": "lastAggregationTimestamp",
+ "offset": 16,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:274"
+ },
+ {
+ "label": "__legacyTrustedAggregatorTimeout",
+ "offset": 24,
+ "slot": "132",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:279",
+ "renamedFrom": "trustedAggregatorTimeout"
+ },
+ {
+ "label": "__legacyPendingStateTimeout",
+ "offset": 0,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:283",
+ "renamedFrom": "pendingStateTimeout"
+ },
+ {
+ "label": "__legacyVerifyBatchTimeTarget",
+ "offset": 8,
+ "slot": "133",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:288",
+ "renamedFrom": "verifyBatchTimeTarget"
+ },
+ {
+ "label": "__legacyMultiplierBatchFee",
+ "offset": 16,
+ "slot": "133",
+ "type": "t_uint16",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:292",
+ "renamedFrom": "multiplierBatchFee"
+ },
+ {
+ "label": "_batchFee",
+ "offset": 0,
+ "slot": "134",
+ "type": "t_uint256",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:296"
+ },
+ {
+ "label": "lastDeactivatedEmergencyStateTimestamp",
+ "offset": 0,
+ "slot": "135",
+ "type": "t_uint64",
+ "contract": "PolygonRollupManager",
+ "src": "contracts/v2/PolygonRollupManager.sol:299"
+ }
+ ],
+ "types": {
+ "t_address": {
+ "label": "address",
+ "numberOfBytes": "20"
+ },
+ "t_array(t_uint256)10_storage": {
+ "label": "uint256[10]",
+ "numberOfBytes": "320"
+ },
+ "t_array(t_uint256)48_storage": {
+ "label": "uint256[48]",
+ "numberOfBytes": "1536"
+ },
+ "t_array(t_uint256)50_storage": {
+ "label": "uint256[50]",
+ "numberOfBytes": "1600"
+ },
+ "t_bool": {
+ "label": "bool",
+ "numberOfBytes": "1"
+ },
+ "t_bytes32": {
+ "label": "bytes32",
+ "numberOfBytes": "32"
+ },
+ "t_contract(IPolygonRollupBase)6433": {
+ "label": "contract IPolygonRollupBase",
+ "numberOfBytes": "20"
+ },
+ "t_enum(VerifierType)6622": {
+ "label": "enum IPolygonRollupManager.VerifierType",
+ "members": [
+ "StateTransition",
+ "Pessimistic"
+ ],
+ "numberOfBytes": "1"
+ },
+ "t_mapping(t_address,t_bool)": {
+ "label": "mapping(address => bool)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_address,t_uint32)": {
+ "label": "mapping(address => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_bytes32,t_struct(RoleData)7254_storage)": {
+ "label": "mapping(bytes32 => struct PolygonAccessControlUpgradeable.RoleData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint256,t_struct(PendingState)7135_storage)": {
+ "label": "mapping(uint256 => struct LegacyZKEVMStateVariables.PendingState)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupData)3683_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint32,t_struct(RollupType)3633_storage)": {
+ "label": "mapping(uint32 => struct PolygonRollupManager.RollupType)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_bytes32)": {
+ "label": "mapping(uint64 => bytes32)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_struct(SequencedBatchData)7125_storage)": {
+ "label": "mapping(uint64 => struct LegacyZKEVMStateVariables.SequencedBatchData)",
+ "numberOfBytes": "32"
+ },
+ "t_mapping(t_uint64,t_uint32)": {
+ "label": "mapping(uint64 => uint32)",
+ "numberOfBytes": "32"
+ },
+ "t_string_storage": {
+ "label": "string",
+ "numberOfBytes": "32"
+ },
+ "t_struct(PendingState)7135_storage": {
+ "label": "struct LegacyZKEVMStateVariables.PendingState",
+ "members": [
+ {
+ "label": "timestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "0"
+ },
+ {
+ "label": "exitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "stateRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ }
+ ],
+ "numberOfBytes": "96"
+ },
+ "t_struct(RoleData)7254_storage": {
+ "label": "struct PolygonAccessControlUpgradeable.RoleData",
+ "members": [
+ {
+ "label": "members",
+ "type": "t_mapping(t_address,t_bool)",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "adminRole",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_struct(RollupData)3683_storage": {
+ "label": "struct PolygonRollupManager.RollupData",
+ "members": [
+ {
+ "label": "rollupContract",
+ "type": "t_contract(IPolygonRollupBase)6433",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "chainID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "batchNumToStateRoot",
+ "type": "t_mapping(t_uint64,t_bytes32)",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "sequencedBatches",
+ "type": "t_mapping(t_uint64,t_struct(SequencedBatchData)7125_storage)",
+ "offset": 0,
+ "slot": "3"
+ },
+ {
+ "label": "_legacyPendingStateTransitions",
+ "type": "t_mapping(t_uint256,t_struct(PendingState)7135_storage)",
+ "offset": 0,
+ "slot": "4"
+ },
+ {
+ "label": "lastLocalExitRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "5"
+ },
+ {
+ "label": "lastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatch",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "6"
+ },
+ {
+ "label": "_legacyLastPendingState",
+ "type": "t_uint64",
+ "offset": 16,
+ "slot": "6"
+ },
+ {
+ "label": "_legacyLastPendingStateConsolidated",
+ "type": "t_uint64",
+ "offset": 24,
+ "slot": "6"
+ },
+ {
+ "label": "lastVerifiedBatchBeforeUpgrade",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "7"
+ },
+ {
+ "label": "rollupTypeID",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "7"
+ },
+ {
+ "label": "rollupVerifierType",
+ "type": "t_enum(VerifierType)6622",
+ "offset": 16,
+ "slot": "7"
+ },
+ {
+ "label": "lastPessimisticRoot",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "8"
+ },
+ {
+ "label": "programVKey",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "9"
+ }
+ ],
+ "numberOfBytes": "320"
+ },
+ "t_struct(RollupType)3633_storage": {
+ "label": "struct PolygonRollupManager.RollupType",
+ "members": [
+ {
+ "label": "consensusImplementation",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "verifier",
+ "type": "t_address",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "forkID",
+ "type": "t_uint64",
+ "offset": 20,
+ "slot": "1"
+ },
+ {
+ "label": "rollupVerifierType",
+ "type": "t_enum(VerifierType)6622",
+ "offset": 28,
+ "slot": "1"
+ },
+ {
+ "label": "obsolete",
+ "type": "t_bool",
+ "offset": 29,
+ "slot": "1"
+ },
+ {
+ "label": "genesis",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "2"
+ },
+ {
+ "label": "programVKey",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "3"
+ }
+ ],
+ "numberOfBytes": "128"
+ },
+ "t_struct(SequencedBatchData)7125_storage": {
+ "label": "struct LegacyZKEVMStateVariables.SequencedBatchData",
+ "members": [
+ {
+ "label": "accInputHash",
+ "type": "t_bytes32",
+ "offset": 0,
+ "slot": "0"
+ },
+ {
+ "label": "sequencedTimestamp",
+ "type": "t_uint64",
+ "offset": 0,
+ "slot": "1"
+ },
+ {
+ "label": "previousLastBatchSequenced",
+ "type": "t_uint64",
+ "offset": 8,
+ "slot": "1"
+ }
+ ],
+ "numberOfBytes": "64"
+ },
+ "t_uint16": {
+ "label": "uint16",
+ "numberOfBytes": "2"
+ },
+ "t_uint256": {
+ "label": "uint256",
+ "numberOfBytes": "32"
+ },
+ "t_uint32": {
+ "label": "uint32",
+ "numberOfBytes": "4"
+ },
+ "t_uint64": {
+ "label": "uint64",
+ "numberOfBytes": "8"
+ },
+ "t_uint8": {
+ "label": "uint8",
+ "numberOfBytes": "1"
+ }
+ },
+ "namespaces": {}
+ }
+ }
+ }
+}
diff --git a/upgrade/upgradePessimistic/mainnet-info/upgrade_output.json b/upgrade/upgradePessimistic/mainnet-info/upgrade_output.json
new file mode 100644
index 000000000..3253af405
--- /dev/null
+++ b/upgrade/upgradePessimistic/mainnet-info/upgrade_output.json
@@ -0,0 +1,20 @@
+{
+ "scheduleData": "0x01d5062a0000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000a49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000a33619940bceb9be7c9679dd80fa2918c2476382000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "executeData": "0x134008d30000000000000000000000000f99738b2fc14d77308337f3e2596b63ae7bcc4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a49623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000a33619940bceb9be7c9679dd80fa2918c2476382000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "timelockContractAddress": "0xEf1462451C30Ea7aD8555386226059Fe837CA4EF",
+ "decodedScheduleData": {
+ "target": "0x0F99738B2Fc14D77308337f3e2596b63aE7BCC4A",
+ "value": "0",
+ "data": "0x9623609d0000000000000000000000005132a183e9f3cb7c848b0aac5ae0c4f0491b7ab2000000000000000000000000a33619940bceb9be7c9679dd80fa2918c2476382000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000048129fc1c00000000000000000000000000000000000000000000000000000000",
+ "decodedData": {
+ "signature": "upgradeAndCall(address,address,bytes)",
+ "selector": "0x9623609d",
+ "proxy": "0x5132A183E9F3CB7C848b0AAC5Ae0c4f0491B7aB2",
+ "implementation": "0xA33619940bceb9be7c9679Dd80FA2918C2476382",
+ "data": "0x8129fc1c"
+ },
+ "predecessor": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "delay": "864000"
+ }
+}
\ No newline at end of file
diff --git a/upgrade/upgradePessimistic/upgradePessimistic.ts b/upgrade/upgradePessimistic/upgradePessimistic.ts
new file mode 100644
index 000000000..7d3e27255
--- /dev/null
+++ b/upgrade/upgradePessimistic/upgradePessimistic.ts
@@ -0,0 +1,218 @@
+/* eslint-disable no-await-in-loop, no-use-before-define, no-lonely-if */
+/* eslint-disable no-console, no-inner-declarations, no-undef, import/no-unresolved */
+import {expect} from "chai";
+import path = require("path");
+import fs = require("fs");
+import {utils} from "ffjavascript";
+
+import * as dotenv from "dotenv";
+dotenv.config({path: path.resolve(__dirname, "../../.env")});
+import {ethers, upgrades} from "hardhat";
+import {PolygonRollupManager} from "../../typechain-types";
+
+const pathOutputJson = path.join(__dirname, "./upgrade_output.json");
+
+const upgradeParameters = require("./upgrade_parameters.json");
+
+async function main() {
+ upgrades.silenceWarnings();
+
+ /*
+ * Check upgrade parameters
+ * Check that every necessary parameter is fulfilled
+ */
+ const mandatoryUpgradeParameters = ["rollupManagerAddress", "timelockDelay"];
+
+ for (const parameterName of mandatoryUpgradeParameters) {
+ if (upgradeParameters[parameterName] === undefined || upgradeParameters[parameterName] === "") {
+ throw new Error(`Missing parameter: ${parameterName}`);
+ }
+ }
+ const {rollupManagerAddress, timelockDelay} = upgradeParameters;
+ const salt = upgradeParameters.timelockSalt || ethers.ZeroHash;
+
+ // Load onchain parameters
+ const polygonRMFactory = await ethers.getContractFactory("PolygonRollupManagerPrevious");
+ const polygonRMContract = (await polygonRMFactory.attach(rollupManagerAddress)) as PolygonRollupManager;
+
+ const globalExitRootManagerAddress = await polygonRMContract.globalExitRootManager();
+ const polAddress = await polygonRMContract.pol();
+ const bridgeAddress = await polygonRMContract.bridgeAddress();
+
+ // Load provider
+ const currentProvider = ethers.provider;
+ if (upgradeParameters.multiplierGas || upgradeParameters.maxFeePerGas) {
+ if (process.env.HARDHAT_NETWORK !== "hardhat") {
+ currentProvider = ethers.getDefaultProvider(
+ `https://${process.env.HARDHAT_NETWORK}.infura.io/v3/${process.env.INFURA_PROJECT_ID}`
+ ) as any;
+ if (upgradeParameters.maxPriorityFeePerGas && upgradeParameters.maxFeePerGas) {
+ console.log(
+ `Hardcoded gas used: MaxPriority${upgradeParameters.maxPriorityFeePerGas} gwei, MaxFee${upgradeParameters.maxFeePerGas} gwei`
+ );
+ const FEE_DATA = new ethers.FeeData(
+ null,
+ ethers.parseUnits(upgradeParameters.maxFeePerGas, "gwei"),
+ ethers.parseUnits(upgradeParameters.maxPriorityFeePerGas, "gwei")
+ );
+
+ currentProvider.getFeeData = async () => FEE_DATA;
+ } else {
+ console.log("Multiplier gas used: ", upgradeParameters.multiplierGas);
+ async function overrideFeeData() {
+ const feeData = await ethers.provider.getFeeData();
+ return new ethers.FeeData(
+ null,
+ ((feeData.maxFeePerGas as bigint) * BigInt(upgradeParameters.multiplierGas)) / 1000n,
+ ((feeData.maxPriorityFeePerGas as bigint) * BigInt(upgradeParameters.multiplierGas)) / 1000n
+ );
+ }
+ currentProvider.getFeeData = overrideFeeData;
+ }
+ }
+ }
+
+ // Load deployer
+ let deployer;
+ if (upgradeParameters.deployerPvtKey) {
+ deployer = new ethers.Wallet(upgradeParameters.deployerPvtKey, currentProvider);
+ } else if (process.env.MNEMONIC) {
+ deployer = ethers.HDNodeWallet.fromMnemonic(
+ ethers.Mnemonic.fromPhrase(process.env.MNEMONIC),
+ "m/44'/60'/0'/0/0"
+ ).connect(currentProvider);
+ } else {
+ [deployer] = await ethers.getSigners();
+ }
+
+ console.log("deploying with: ", deployer.address);
+
+ const proxyAdmin = await upgrades.admin.getInstance();
+
+ // Assert correct admin
+ expect(await upgrades.erc1967.getAdminAddress(rollupManagerAddress as string)).to.be.equal(proxyAdmin.target);
+
+ const timelockAddress = await proxyAdmin.owner();
+
+ // load timelock
+ const timelockContractFactory = await ethers.getContractFactory("PolygonZkEVMTimelock", deployer);
+
+ // prepare upgrades
+
+ // Upgrade to rollup manager
+ const PolygonRollupManagerFactory = await ethers.getContractFactory("PolygonRollupManager", deployer);
+
+ const implRollupManager = await upgrades.prepareUpgrade(rollupManagerAddress, PolygonRollupManagerFactory, {
+ constructorArgs: [globalExitRootManagerAddress, polAddress, bridgeAddress],
+ unsafeAllow: ["constructor", "state-variable-immutable", "enum-definition", "struct-definition"],
+ unsafeAllowRenames: true,
+ unsafeAllowCustomTypes: true,
+ unsafeSkipStorageCheck: true,
+ });
+
+ console.log("#######################\n");
+ console.log(`Polygon rollup manager: ${implRollupManager}`);
+
+ console.log("you can verify the new impl address with:");
+ console.log(
+ `npx hardhat verify --constructor-args upgrade/arguments.js ${implRollupManager} --network ${process.env.HARDHAT_NETWORK}\n`
+ );
+ console.log("Copy the following constructor arguments on: upgrade/arguments.js \n", [
+ globalExitRootManagerAddress,
+ polAddress,
+ bridgeAddress,
+ ]);
+
+ const operationRollupManager = genOperation(
+ proxyAdmin.target,
+ 0, // value
+ proxyAdmin.interface.encodeFunctionData("upgradeAndCall", [
+ rollupManagerAddress,
+ implRollupManager,
+ PolygonRollupManagerFactory.interface.encodeFunctionData("initialize", []),
+ ]), // data
+ ethers.ZeroHash, // predecessor
+ salt // salt
+ );
+
+ // Schedule operation
+ const scheduleData = timelockContractFactory.interface.encodeFunctionData("schedule", [
+ operationRollupManager.target,
+ operationRollupManager.value,
+ operationRollupManager.data,
+ ethers.ZeroHash, // predecessor
+ salt, // salt
+ timelockDelay,
+ ]);
+
+ // Execute operation
+ const executeData = timelockContractFactory.interface.encodeFunctionData("execute", [
+ operationRollupManager.target,
+ operationRollupManager.value,
+ operationRollupManager.data,
+ ethers.ZeroHash, // predecessor
+ salt, // salt
+ ]);
+
+ console.log({scheduleData});
+ console.log({executeData});
+
+ const outputJson = {
+ scheduleData,
+ executeData,
+ timelockContractAddress: timelockAddress,
+ };
+
+ // Decode the scheduleData for better readability
+ const timelockTx = timelockContractFactory.interface.parseTransaction({data: scheduleData});
+ const paramsArray = timelockTx?.fragment.inputs as any;
+ const objectDecoded = {} as any;
+
+ for (let i = 0; i < paramsArray?.length; i++) {
+ const currentParam = paramsArray[i];
+ objectDecoded[currentParam.name] = timelockTx?.args[i];
+
+ if (currentParam.name == "data") {
+ const decodedProxyAdmin = proxyAdmin.interface.parseTransaction({
+ data: timelockTx?.args[i],
+ });
+ const objectDecodedData = {} as any;
+ const paramsArrayData = decodedProxyAdmin?.fragment.inputs as any;
+
+ objectDecodedData.signature = decodedProxyAdmin?.signature;
+ objectDecodedData.selector = decodedProxyAdmin?.selector;
+
+ for (let j = 0; j < paramsArrayData?.length; j++) {
+ const currentParam = paramsArrayData[j];
+ objectDecodedData[currentParam.name] = decodedProxyAdmin?.args[j];
+ }
+ objectDecoded["decodedData"] = objectDecodedData;
+ }
+ }
+
+ outputJson.decodedScheduleData = objectDecoded;
+
+ fs.writeFileSync(pathOutputJson, JSON.stringify(utils.stringifyBigInts(outputJson), null, 1));
+}
+
+main().catch((e) => {
+ console.error(e);
+ process.exit(1);
+});
+
+// OZ test functions
+function genOperation(target: any, value: any, data: any, predecessor: any, salt: any) {
+ const abiEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
+ ["address", "uint256", "bytes", "uint256", "bytes32"],
+ [target, value, data, predecessor, salt]
+ );
+ const id = ethers.keccak256(abiEncoded);
+ return {
+ id,
+ target,
+ value,
+ data,
+ predecessor,
+ salt,
+ };
+}
diff --git a/upgrade/upgradePessimistic/upgrade_parameters.json.example b/upgrade/upgradePessimistic/upgrade_parameters.json.example
new file mode 100644
index 000000000..ba1e2fb60
--- /dev/null
+++ b/upgrade/upgradePessimistic/upgrade_parameters.json.example
@@ -0,0 +1,9 @@
+{
+ "rollupManagerAddress": "0x00..",
+ "timelockDelay": 0,
+ "timelockSalt": "",
+ "deployerPvtKey": "",
+ "maxFeePerGas": "",
+ "maxPriorityFeePerGas": "",
+ "multiplierGas": ""
+}